在上一節中,講了通過 PerformanceCounter 進行CPU的占用率控制。
上一節連接:http://www.BkJia.com/kf/201110/107758.html
本屆中主要介紹如何實現控制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的曲線更加完美。
摘自:Watkins.Song