Windows Sleep功能在给定时间之前唤醒

时间:2014-08-10 05:28:39

标签: c windows winapi internals

我在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

我的问题是如何在我要求的时间之前醒来?我该怎么做才能让它更精确?

1 个答案:

答案 0 :(得分:4)

OS具有用于线程调度的特定量程,这会影响线程等待的准确性。它默认为15 ms,因此Sleep of 20将在它之前或之后结束。这是"设计"。

在Win32桌面应用程序中,可以使用旧的WinMM函数timeBeginPeriod(1)来提高准确性。但是这(a)是一个全局设置,(b)大大降低了电源管理的效率。

你应该使用waitable timer events而不是Sleep,但是当线程停止时你仍然会受到线程调度量的影响。