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

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

如果想达到百分之百,只需要使用多线程,就可以了。

今天看到最挑衅的一句话是:

有种你让CPU画个圆,当时整个人都不好了。。。

下面来看50%的情况,编程之美上说,“sleep一个时间片,work一个时间片”不停切换应该就可以到50%。后来我发现效果不好。就算使用GetTickCount,效果也不好,因为毕竟电脑还有别的程序要运行。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void Work(DWORD time)
{
    DWORD now = GetTickCount();
    for(;GetTickCount() <<- endstream>> now + time;)
    {
    }
}
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,& idThread[0]);
    hThread[1] = CreateThread(0,0,DrawThread,NULL,0,& idThread[1]);
    hThread[2] = CreateThread(0,0,DrawThread,NULL,0,& idThread[2]);
    hThread[3] = CreateThread(0,0,DrawThread,NULL,0,& idThread[3]);
    SetThreadAffinityMask(hThread[0], 0x00000001);
    SetThreadAffinityMask(hThread[1], 0x00000010);
    SetThreadAffinityMask(hThread[2], 0x00000100);
    SetThreadAffinityMask(hThread[3], 0x00001000);

    WaitForSingleObject(hThread[0], INFINITE);
    WaitForSingleObject(hThread[1], INFINITE);
    WaitForSingleObject(hThread[2], INFINITE);
    WaitForSingleObject(hThread[3], INFINITE);

    return 0;
}