A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

控制CPU占有率


CPU利用率//CPU利用率是指 CPU执行非系统空闲进程的时间 / CPU总的执行时间

相关的API函数:
  1. GetTickCount(); //返回(retrieve)从操作系统启动所经过(elapsed)的毫秒数,它的返回值是DWORD。  
  2. Sleep();//让当前线程挂机一段时间  
  3. WaitForSingleObject()// 详见http://baike.so.com/doc/6708461.html
复制代码

让CPU占有率为一条直线
  1. DWORD WINAPI LineThread(LPVOID Line)   
  2. {   
  3.     DWORD busyTime = 150;  
  4.     DWORD idleTime = busyTime;  
  5.     DWORD startTime ;  
  6.     while(true)  
  7.     {  
  8.         startTime = GetTickCount();  
  9.         while((GetTickCount()-startTime) <= busyTime)   
  10.             ;   
  11.         Sleep(idleTime);   
  12.     }  
  13.     return 0;   
  14. }
复制代码

让CPU占有率为一条正弦曲线
  1. #define COUNT   200   
  2. const double   PI = 3.14159265;   
  3. const int Total = 300;   
  4.   
  5. DWORD WINAPI SinThread(LPVOID Sin)   
  6. {   
  7.     DWORD busy[COUNT];   
  8.     DWORD idle[COUNT];   
  9.     int half = 150;   
  10.     double radian = 0.0;   
  11.     double   radianIncrement = 0.01;   
  12.     DWORD startTime;   
  13.     int i;   
  14.     for (i = 0; i < COUNT;  i++)   
  15.     {   
  16.         busy = (DWORD)(half + half*sin(PI*radian));   
  17.         idle = (DWORD)(Total - busy);   
  18.         radian += radianIncrement;   
  19.     }   
  20.     i = 0;  
  21.     while(true)  
  22.     {  
  23.         i %= COUNT;  
  24.         startTime = GetTickCount();      
  25.         while((GetTickCount()-startTime) <= busy)   
  26.             ;   
  27.         Sleep(idle);   
  28.         i++;  
  29.     }  
  30.     return 0;   
  31. }
复制代码
执行效果:


我的电脑有4个核心,我让第一个核心执行正弦曲线,第二个核心执行直线;
执行代码如下:
  1. int main()  
  2. {  
  3.     HANDLE hThread1, hThread2;   
  4.     DWORD dwThreadId1, dwThreadId2;   
  5.     hThread1 = CreateThread(NULL, 0, SinThread, 0, CREATE_SUSPENDED, &dwThreadId1);   
  6.     hThread2 = CreateThread(NULL, 0, LineThread, 0, CREATE_SUSPENDED, &dwThreadId2);   
  7.     SetThreadAffinityMask(hThread1, 1);   
  8.     SetThreadAffinityMask(hThread2, 2);   
  9.     ResumeThread(hThread1);   
  10.     ResumeThread(hThread2);   
  11.     SuspendThread(GetCurrentThread());   
  12.     return 0;   
  13. }  
复制代码






1 个回复

正序浏览
这个在编程之美中好像有这题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马