我在64位计算机上运行一个简单的代码,Windows 7作为标准的Windows应用程序运行:
do {
DWORD getCurrentTick = GetTickCount();;
Sleep(20);
DWORD nextTick = GetTickCount();
printf("Tick = %d\n", nextTick - getCurrentTick);
} while(TRUE);
我知道用户模式线程休眠不能保证在请求的时间唤醒,但奇怪的是窗口在时间到来之前唤醒。看看我的输出:
Tick = 15
Tick = 16
Tick = 16
Tick = 31
Tick = 15
Tick = 16
Tick = 15
Tick = 16
Tick = 31
我的问题是如何在我要求的时间之前醒来?我该怎么做才能让它更精确?
答案 0 :(得分:4)
OS具有用于线程调度的特定量程,这会影响线程等待的准确性。它默认为15 ms,因此Sleep of 20将在它之前或之后结束。这是"设计"。
在Win32桌面应用程序中,可以使用旧的WinMM函数timeBeginPeriod(1)来提高准确性。但是这(a)是一个全局设置,(b)大大降低了电源管理的效率。
你应该使用waitable timer events而不是Sleep,但是当线程停止时你仍然会受到线程调度量的影响。