题目:
写一个程序,让用户来决定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;
}
测试结果如下:
直线:
正弦函数: