写一个程序,让用户决定Windows任务管理器的CPU占用率。
1. 50%CPU占用率。
2. 任意比例。
3. 正弦曲线。
- 解法一:简单的解法
假设CPU是2.4GHz(2.4 * 10的9次方个时钟周期每秒),CPU执行的是机器指令,最接近机器指令的语言是汇编语言,如下空循环翻译成5条汇编代码。( 2 400 000 000 * 2 ) / 5 = 960 000 000 (循环/秒)。若让CPU工作1秒钟,然后休息1秒钟,波形很可能变成锯齿状。所以降低两个数量级,同时10ms比较接近windows的调度时间片。
#include <stdio.h>
#include <Windows.h>
int main() {
for (; ;) {
for (int i = 0; i < 9600000; i++) {
;
}
Sleep(10);
}
};
怎么让CPU“闲下来”?
—-> 或者等待用户的输入,或者等待某些事件发生,或者主动进入休眠状态。
- 解法二:使用GetTickCount()和Sleep()
GetTickCount()可以得到“系统启动到现在”所经历时间的毫秒值。
const DWORD busyTime = 10;
const DWORD idleTime = busyTime;
while(true) {
DWORD startTime = GetTickCount();
while ( (GetTickCount() - startTime) <= busyTime )
;
Sleep(idleTime);
}
- 解法三:能动态适应的解法
static void MakeUsage(float level)
{
PerformanceCounter p = new PerformanceCounter("Processor", "%Processor Time", "_Total");
while (true)
{
if (p.NextValue() > level)
System.Threading.Thread.Sleep(10);
}
}
- 解法四:正弦曲线