VC中对CPU占用率的控制

来源:互联网 发布:mac docker lnmp 编辑:程序博客网 时间:2024/06/10 14:29

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的使用进一步得到了熟悉,对线程与进程的知识又增进了了解。