您的位置:首页 > 编程语言

编程之美:让CPU占用率曲线听你指挥

2014-03-01 20:59 453 查看
题目:

写一个程序,让用户来决定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;
}
测试结果如下:

直线:



正弦函数:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: