题目:
写一个程序,让用户来决定Windows任务管理器的CPU占用率。程序越精简越好。例如可以实现下面三种情况:
1、CPU的占用率固定在50%,为一条直线
2、CPU占用率为一条直线,但是具体占用率由命令行参数决定(参数范围1~100)
3、CPU占用率状态是一个正弦曲线。
用到一些API函数:
1、Sleep()
2、WaitForSingleObject()//自己停下来,等待某个事件发生
3、GetTickCount()//“滴答”
4、GetProcessorInfo()/SetThreadAffinityMask()//让线程在某个CPU上运行
5、GetCPUTickCount()//获取CPU核心运行周期数
#include <iostream> #include <windows.h> #include <stdlib.h> #include <math.h> using namespace std; const double SPLIT=0.01; const int COUNT=200; const double PI=3.14159265; const int INTERVAL=300; DWORD busySpan[COUNT]; DWORD idleSpan[COUNT]; void thread1(){ DWORD startTime=0; DWORD busyTime=50; DWORD idleTime=busyTime; while(true){ startTime=GetTickCount(); while((GetTickCount()-startTime)<=busyTime); Sleep(idleTime); } } void thread2(){ DWORD startTime=0; int j=0; while(true){ j=j%COUNT; startTime=GetTickCount(); while((GetTickCount()-startTime)<=busySpan[j]); Sleep(idleSpan[j]); j++; } } int main(){ int half=INTERVAL/2; double radian=0.0; for(int i=0;i<COUNT;i++){ busySpan[i]=(DWORD)(half+(sin(PI*radian)*half)); idleSpan[i]=INTERVAL-busySpan[i]; radian+=SPLIT; } HANDLE handle; DWORD threadID; if((handle=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&thread2,0,0,&threadID))!=NULL) SetThreadAffinityMask(handle,1); WaitForSingleObject(handle,INFINITE); return 1; }测试结果如下:
直线:
正弦函数:
编程之美:让CPU占用率曲线听你指挥,布布扣,bubuko.com
原文:http://blog.csdn.net/starcuan/article/details/20228591