我有一个简单的代码运行在我的64位机器上,Windows 7作为一个标准的Windows应用程序:
do {
DWORD getCurrentTick = GetTickCount();;
Sleep(20);
DWORD nextTick = GetTickCount();
printf("Tick = %dn", nextTick - getCurrentTick);
} while(TRUE);
我知道用户模式线程睡眠不能保证在请求时间唤醒,但奇怪的是windows在时间到来之前唤醒。看看我的输出:
Tick = 15
Tick = 16
Tick = 16
Tick = 31
Tick = 15
Tick = 16
Tick = 15
Tick = 16
Tick = 31
我的问题是为什么它在我要求的时间之前醒来?我怎么做才能让它更精确呢?
操作系统有一个特定的线程调度量,这会影响线程等待的准确性。它的默认值是15毫秒,所以20的Sleep会在它之前或之后结束。这是"by design"。
在Win32桌面应用程序中可以通过使用旧的WinMM函数timeBeginPeriod(1)来提高精度;但这(a)是一个全局设置,(b)大大降低了电源管理的效率。
您应该使用可等待定时器事件而不是Sleep,但是当线程停止时,您仍将受到线程调度量子的准确性的影响。