在上一节中,讲了通过 PerformanceCounter 进行CPU的占用率控制。
上一节连接:
http://blog.csdn.net/weixingstudio/article/details/6867473
本届中主要介绍如何实现控制CPU占用率曲线为一个正弦曲线。
在一段时间内,通过控制CPU繁忙时间调整CPU的占用率显示。
代码:
// cpu_4.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "stdlib.h" #include "stdio.h" #include "iostream" #include "math.h" #include "windows.h" using namespace std; const int SAMPLING_COUNT=200; const double PI=3.1415926; const int TOTAL_AMPLITUDE=250; int _tmain(int argc, _TCHAR* argv[]) { cout<<"test the cpu"<<endl; DWORD cpuRate[SAMPLING_COUNT]; int amplitude=TOTAL_AMPLITUDE/2; double radian=0.0; double radianIncrement=2.0/(double)SAMPLING_COUNT; for(int i=0;i<SAMPLING_COUNT;i++) { cpuRate[i]=(DWORD)(amplitude+(sin(PI*radian)*amplitude)); radian+=radianIncrement; } DWORD startTime=GetTickCount(); for(int j=0;;j=(j+1)%SAMPLING_COUNT) { startTime=GetTickCount(); while((GetTickCount()-startTime)<=cpuRate[j]) { } Sleep(TOTAL_AMPLITUDE-cpuRate[j]); } return 0; }
解释:
const int SAMPLING_COUNT=200; 定义一个正弦周期内的采样点个数
const int TOTAL_AMPLITUDE=150; 定义一个调度时间片的大小,这样通过这个时间片控制CPU的繁忙还有空闲时间。
DWORD cpuRate[SAMPLING_COUNT]; 记录每一个采样点的CPU的占用率,其实实际存储的是CPU的繁忙时间的大小。
int amplitude=TOTAL_AMPLITUDE/2; 记录半个时间片的大小,因为正弦函数的控制从中间开始,即sin0.
double radianIncrement=2.0/(double)SAMPLING_COUNT; 记录每一个采样点的增量
for(int i=0;i<SAMPLING_COUNT;i++)
{
cpuRate[i]=(DWORD)(amplitude+(sin(PI*radian)*amplitude));
radian+=radianIncrement;
}
// 上面代码循环计算每一个采样点的CPU占用率,实际存储的为CPU繁忙时间在这个时间片中的大小。通过控制繁忙时间的比例,控制CPU的占用率。
DWORD startTime=GetTickCount();
for(int j=0;;j=(j+1)%SAMPLING_COUNT)
{
startTime=GetTickCount();
while((GetTickCount()-startTime)<=cpuRate[j])
{
}
Sleep(TOTAL_AMPLITUDE-cpuRate[j]);
}
// 控制CPU在繁忙和空闲的两个时间片中交互操作,从而实现控制CPU的占用率。
测试结果如果, 不同的时间片大小,结果不一样。经过测试当时间片大小为150时,效果最好。
时间片大小为150:
时间片大小为100:
还需要进一步调试,让CPU的曲线更加完美。