1下面代码生成了一条CPU占用率为50%的直
第一种方法
for(;;)
{
for(int i=0;i<6600000;i++)//这个数字根据个PC的主频计算,结合机器周期与时钟周期的知识计算并做适当调节得到
;
Sleep(100);//这里的数值不易过小,若远小于Windows的调度时间片,会造成线程频繁的唤醒和挂起,无形中增加了内核时间
//的不确定性
}
这里注意的是:由于现在的PC多为多核,为方便控制占用率可通过调节进程的相关性设置具体的CPU(在任务管理器中右击运行的进程,选择“设置相关性”即可),也可,通过SetProcessAffinityMask函数进行设置例如通过在进程中增加SetProcessAffinityMask(GetCurrentProcess(),2)语句即把当前进程所用的CPU设置为第二个(CPU 1).至于CPU曲线的变化可同过资源监视器来获得。该程序的CPU占有率曲线如下图:
第二种方法:
int busytime=100;
int idletime=busytime;
long starttime=0;
while(true)
{
starttime=GetTickCount();
//std::cout<<starttime<<std::endl;//调试用
while((GetTickCount()-starttime)<=busytime)
;
Sleep(idletime);
}
说明:这种方法引入了GetTickCount()(具体用法参见MSDN)来返回自开机后所运行的时间,而不必手动计算循环数;并且比较精准,效果如下(可以看到效果比方法一要好):
2 sin曲线的生成
const double SPLIT=0.01;
const int COUNT=200;
const double PI=3.1415926;
const int INTERVAL=300;
float busyspan[COUNT];
float idlespan[COUNT];
int half =INTERVAL/2;
double radian=0.0;
for(int i=0;i<COUNT;i++)
{
busyspan[i]=half+half*sin(PI*radian);
idlespan[i]=INTERVAL-busyspan[i];
radian+=SPLIT;
}
DWORD starttime=0;
int j=0;
while(true)
{
j=j%COUNT;
starttime=GetTickCount();
while((GetTickCount()-starttime)<=busyspan[j])
;
Sleep(idlespan[j]);
j++;
}
效果图如下:
通过学习,对MSDN的使用进一步得到了熟悉,对线程与进程的知识又增进了了解。