首页 » 编程之美 » 正文

[编程之美_1]CPU绘制曲线

其实这个题满跑很简单,那就是写个死循环就行了。操作系统分给的时间片就会越来越多。但是现在的程序都是多核的,比如我的电脑是4核的,会发现,CPU大概永远在25~27%左右,并没有达到100%。

如果想达到百分之百,只需要使用多线程,就可以了。
今天看到最挑衅的一句话是:
有种你让CPU画个圆,当时整个人都不好了。。。
下面来看50%的情况,编程之美上说,“sleep一个时间片,work一个时间片”不停切换应该就可以到50%。后来我发现效果不好。就算使用GetTickCount,效果也不好,因为毕竟电脑还有别的程序要运行。
结果如下:
[编程之美_1]CPU绘制曲线
代码如下:
正弦曲线:
效果如下:
[编程之美_1]CPU绘制曲线
代码如下:

void Work(DWORD time)
{
   DWORD now = GetTickCount();
   for(;GetTickCount() <</span> now + time;)
   {</p>

<p>}
}
DWORD WINAPI DrawThread(LPVOID lParam)
{
   double deta = 0.1f;
   while (true)
   {
       double time = 500 + 500 * sin(deta);
       Work(time);
       Sleep(1000-time);
       deta += 0.1f;
   }
   return 0;
}
int main()
{
   HANDLE hThread[4];
   DWORD idThread[4];
   hThread[0] = CreateThread(0,0,DrawThread,NULL,0,&amp;idThread[0]);
   hThread[1] = CreateThread(0,0,DrawThread,NULL,0,&amp;idThread[1]);
   hThread[2] = CreateThread(0,0,DrawThread,NULL,0,&amp;idThread[2]);
   hThread[3] = CreateThread(0,0,DrawThread,NULL,0,&amp;idThread[3]);
   SetThreadAffinityMask(hThread[0], 0x00000001);
   SetThreadAffinityMask(hThread[1], 0x00000010);
   SetThreadAffinityMask(hThread[2], 0x00000100);
   SetThreadAffinityMask(hThread[3], 0x00001000);</p>

<p>WaitForSingleObject(hThread[0], INFINITE);
   WaitForSingleObject(hThread[1], INFINITE);
   WaitForSingleObject(hThread[2], INFINITE);
   WaitForSingleObject(hThread[3], INFINITE);</p>

<p>return 0;
}

发表评论