请问如何做到?

解决方案 »

  1.   

    不同的CPU的速度也是不一样的
    所以要根据运行情况调整
      

  2.   

    在工作线程中完成耗时的任务。用代码取得当前的CPU使用率,如果过高, 则Sleep.
      

  3.   

    写了一个双核下应该也可以吧
    #include <windows.h>
    #include <stdio.h>
    #define RATE 0.50
    #define ERROR_VALUE 0.001
    #define SAMPLE_GRANULARITY 20000000
    #define FILETIME_TO_LARGEINTEGER(li, ft) \
    ((li)->HighPart = (ft).dwHighDateTime, (li)->LowPart = (ft).dwLowDateTime)typedef struct _cpu_usage_t
    {
    double rate;
    double lastrate;
    LARGE_INTEGER start;
    LARGE_INTEGER used;
    LARGE_INTEGER usage;
    LARGE_INTEGER total;
    UINT counter;
    }cpu_usage_t;typedef struct _worker_t
    {
    cpu_usage_t usage;
    HANDLE      hd;
    DWORD       mask;
    }worker_t;BOOL get_cpu_usage(cpu_usage_t *pret)
    { FILETIME ftStart, ftDummy, ftKernel, ftUser, ftCurrent;
    LARGE_INTEGER liKernel, liUser, liCurrent;
    SYSTEMTIME stCurrentTime; if (pret->start.QuadPart == 0)
    {
    GetProcessTimes(GetCurrentProcess(), &ftStart, &ftDummy, &ftDummy, &ftDummy);
    FILETIME_TO_LARGEINTEGER(&pret->start, ftStart);
    pret->start.QuadPart = 0;
    } GetSystemTime(&stCurrentTime);
    SystemTimeToFileTime(&stCurrentTime, &ftCurrent);
    FILETIME_TO_LARGEINTEGER(&liCurrent, ftCurrent);
    pret->total.QuadPart = liCurrent.QuadPart - pret->start.QuadPart; GetProcessTimes(GetCurrentProcess(), &ftDummy, &ftDummy, &ftKernel, &ftUser);
    FILETIME_TO_LARGEINTEGER(&liKernel, ftKernel);
    FILETIME_TO_LARGEINTEGER(&liUser, ftUser);
    pret->usage.QuadPart = liKernel.QuadPart + liUser.QuadPart - pret->used.QuadPart; pret->rate = (double)pret->usage.QuadPart / (double)pret->total.QuadPart; if (pret->total.QuadPart >= SAMPLE_GRANULARITY)
    {
    pret->start.QuadPart = liCurrent.QuadPart;
    pret->used.QuadPart = liKernel.QuadPart + liUser.QuadPart;
    pret->counter ++; 
    } return TRUE;
    }void use_cpu()
    {
    return;
    }DWORD WINAPI worker(LPVOID lpPara)
    { worker_t* pworker;
    double prevrate = 0.0;
    UINT precounter = 0; pworker = (worker_t*)lpPara; SetThreadAffinityMask(GetCurrentThread(), pworker->mask); memset(&pworker->usage, 0, sizeof(pworker->usage));
    precounter = pworker->usage.counter; while (1)
    {
    get_cpu_usage(&pworker->usage); if (precounter != pworker->usage.counter)
    {
    printf("ThreadAffinityMask:%x : %2.3f\n", pworker->mask, pworker->usage.rate);
    precounter = pworker->usage.counter;
    } if (pworker->usage.rate >= RATE)
    {
    Sleep(1);
    }
    else if (pworker->usage.rate < RATE)
    {
    use_cpu();
    } }
    }static worker_t _wokers[32];int _tmain(int argc, _TCHAR* argv[])
    {
    DWORD dwPAM, dwSAM, dwTemp1, dwTemp2, dwTemp3;
    HANDLE hProc;
    UINT i = 0; hProc = GetCurrentProcess();
    GetProcessAffinityMask(hProc, &dwPAM, &dwSAM); dwTemp1 = dwSAM; while (dwTemp1 != 0)
    {
    dwTemp2 = dwTemp1 - 1;
    dwTemp2 &= dwTemp1;
    dwTemp3 = dwTemp2;
    dwTemp2 = dwTemp2 ^ dwTemp1;
    dwTemp1 = dwTemp3; if (dwTemp2 != 0)
    {
    _wokers[i].mask = dwTemp2;
    _wokers[i].hd = CreateThread(NULL, 0, worker, (LPVOID)&_wokers[i], 0, NULL);
    i++;
    }
    } Sleep(100000); return 0;
    }
      

  4.   

    认真学习一下,不过这个程序在我的机器上运行 CPU的占有率为30%左右。(PS:CPU是HT的)
      

  5.   

    认真学习一下,不过这个程序在我的机器上运行   CPU的占有率为30%左右。(PS:CPU是HT的)
    =========================================================================================
    在单核上是50%
    没有考虑清楚怎么在多核上保证50%
      

  6.   

    把代码中的
    GetProcessTimes(GetCurrentProcess(), &ftStart, &ftDummy, &ftDummy, &ftDummy);
    替换成
    GetThreadTimes(GetCurrentThread(), &ftStart, &ftDummy, &ftDummy, &ftDummy);