Windows中的线程时间片是40ms,即iirc,因此这可能是一个很好的数字,可用作100%标记.
unsigned const TIME_SLICE = 40; float const PI = 3.14159265358979323846f; while(true) { for(unsigned x=0; x!=360; ++x) { float t = sin(static_cast(x)/180*PI)*0.5f + 0.5f; DWORD busy_time = static_cast (t*TIME_SLICE); DWORD wait_start = GetTickCount(); while(GetTickCount() - wait_start < busy_time) { } Sleep(TIME_SLICE - busy_time); } }
这将给出大约14秒的时间段.显然,这假设系统中没有其他重要的CPU使用,并且您只在单个CPU上运行它.这些都不是真的那么普遍.
Windows中的线程时间片是40ms,即iirc,因此这可能是一个很好的数字,可用作100%标记.
unsigned const TIME_SLICE = 40; float const PI = 3.14159265358979323846f; while(true) { for(unsigned x=0; x!=360; ++x) { float t = sin(static_cast(x)/180*PI)*0.5f + 0.5f; DWORD busy_time = static_cast (t*TIME_SLICE); DWORD wait_start = GetTickCount(); while(GetTickCount() - wait_start < busy_time) { } Sleep(TIME_SLICE - busy_time); } }
这将给出大约14秒的时间段.显然,这假设系统中没有其他重要的CPU使用,并且您只在单个CPU上运行它.这些都不是真的那么普遍.
这是在Python中略微修改的@ flodin解决方案:
#!/usr/bin/env python import itertools, math, time, sys time_period = float(sys.argv[1]) if len(sys.argv) > 1 else 30 # seconds time_slice = float(sys.argv[2]) if len(sys.argv) > 2 else 0.04 # seconds N = int(time_period / time_slice) for i in itertools.cycle(range(N)): busy_time = time_slice / 2 * (math.sin(2*math.pi*i/N) + 1) t = time.clock() + busy_time while t > time.clock(): pass time.sleep(time_slice - busy_time);
可以使用time_period
和time_slice
参数微调CPU曲线.
好吧,我有一个与我的第一个答案不同的,可能更好的解决方案.
而不是试图操纵CPU,而是挂钩到任务管理器应用程序,强制它绘制你想要的,而不是CPU结果.接管绘制图形等的GDI对象.排序"作弊",但他们没有说你必须操纵CPU
甚至可以从获取CPU%的任务管理器挂钩调用,而是返回正弦结果.