使用代码来控制。废话不说,直接看代码吧。用了两种方法来控制CPU运行时间。 缺点是没有考虑其他进程的运行状况。 最好的方法是hook任务管理器使用的API(挺麻烦的)。 #include <Windows.h> #include <wchar.h> #include <Powrprof.h> #include <math.h> #pragma comment( lib, "Powrprof.lib" ) typedef struct _PROCESSOR_POWER_INFORMATION { ULONG Number; ULONG MaxMhz; ULONG CurrentMhz; ULONG MhzLimit; ULONG MaxIdleState; ULONG CurrentIdleState; } PROCESSOR_POWER_INFORMATION, *PPROCESSOR_POWER_INFORMATION; DWORD getNumberOfProcessors() { SYSTEM_INFO systemInfo; GetSystemInfo( &systemInfo ); DWORD numberOfProcessors = systemInfo.dwNumberOfProcessors; return numberOfProcessors; } void setRunOnSingleCPU(int processorMask) { HANDLE currentThread = GetCurrentThread(); DWORD_PTR newAffinityMask = processorMask; DWORD_PTR previousAffinityMask = SetThreadAffinityMask( currentThread, newAffinityMask ); if( !previousAffinityMask ) { wprintf( L"SetThreadAffinityMask Error." ); exit( EXIT_FAILURE ); } } void drawLineOnCPUCurve() { double busyTime; DWORD idleTime; busyTime = idleTime = 50; LARGE_INTEGER currentCount; LARGE_INTEGER frequency; BOOL isSuccess = QueryPerformanceFrequency( &frequency ); if( isSuccess == FALSE ) { wprintf( L"QueryPerformanceFrequency Error." ); exit( EXIT_FAILURE ); } while( true ) { isSuccess = QueryPerformanceCounter( ¤tCount ); if( isSuccess == FALSE ) { wprintf( L"QueryPerformanceCounter Error." ); exit( EXIT_FAILURE ); } LONGLONG lastCount = currentCount.QuadPart; double runTime; do { isSuccess = QueryPerformanceCounter( ¤tCount ); if( isSuccess == FALSE ) { wprintf( L"QueryPerformanceCounter Error." ); exit( EXIT_FAILURE ); } runTime = 1000.0 * ( currentCount.QuadPart - lastCount ) / (double)frequency.QuadPart; } while( runTime < busyTime ); Sleep( idleTime ); } } ULONG getCPUFrequency() { PROCESSOR_POWER_INFORMATION info; NTSTATUS state = CallNtPowerInformation( ProcessorInformation, NULL, 0, &info, sizeof(info) ); if( state ) { wprintf( L"CallNtPowerInformation Error." ); exit( EXIT_FAILURE ); } return info.CurrentMhz; } inline __int64 getCPUTickCount() { __asm { rdtsc; } } void drawLineOnCPUCurve2() { double busyTime; DWORD idleTime; busyTime = idleTime = 50; ULONG frequency = getCPUFrequency(); while( true ) { __int64 lastCount = getCPUTickCount(); double runTime; do { __int64 currentCount = getCPUTickCount(); runTime = ( (double) currentCount - (double) lastCount ) / ( ((double) frequency) * 1000 ); } while( runTime < busyTime ); Sleep( idleTime ); } } #define PI 3.1415926 void drawSinOnCPUCurve2(int slices, int sliceTime ) { double *busyTime = new double[ slices]; double *idleTime = new double[ slices]; for ( int i = 0 ; i < slices ; i++) { double biRatio = ( sin( double( 2 * PI / slices * i ) ) + 1.0 ) / 2; busyTime[i] = biRatio * sliceTime; idleTime[i] = sliceTime - busyTime[i]; } ULONG frequency = getCPUFrequency(); int j = 0; while( true ) { __int64 lastCount = getCPUTickCount(); double runTime; do { __int64 currentCount = getCPUTickCount(); runTime = ( (double) currentCount - (double) lastCount ) / ( ((double) frequency) * 1000 ); } while( runTime < busyTime[j] ); Sleep( (DWORD)idleTime[j] ); j = ( j + 1 ) % slices; } } #undef PI DWORD WINAPI drawCPUCurveThread( LPVOID lpParam ) { int processorMask = *( (int *)lpParam ); setRunOnSingleCPU( processorMask ); delete (int *)lpParam; //drawLineOnCPUCurve(); //drawLineOnCPUCurve2(); drawSinOnCPUCurve2( 200, 100 );//将0-2*PI分成200份,每份100ms return 0; } int main() { DWORD numberOfProcessors = getNumberOfProcessors(); HANDLE *threads = new HANDLE[ numberOfProcessors ]; int i; // 有多少个处理器就开多少个线程 for( i = 0; i < numberOfProcessors; i++ ) { int *processorMask = new int[1]; *processorMask = 1 << i; threads[i] = CreateThread( NULL, // default security attributes 0, // use default stack size drawCPUCurveThread,// thread function processorMask, // argument to thread function 0, // use default creation flags NULL); // returns the thread identifier if (threads[i] == NULL) { wprintf( L"CreateThread Error." ); exit( EXIT_FAILURE ); } } WaitForMultipleObjects( numberOfProcessors, threads, TRUE, INFINITE ); for( i = 0; i < numberOfProcessors; i++ ) { CloseHandle( threads[i] ); } return 0; }