【问题标题】:Windows Sleep function wakes before the given timeWindows 睡眠功能在给定时间之前唤醒
【发布时间】:2014-10-03 06:00:49
【问题描述】:

我有一个简单的代码在我的 64 位机器上运行,Windows 7 作为标准 Windows 应用程序:

    do {
        DWORD getCurrentTick = GetTickCount();;
        Sleep(20);
        DWORD nextTick = GetTickCount();

        printf("Tick = %d\n", nextTick - getCurrentTick);
    } while(TRUE);

我知道用户模式线程睡眠不能保证在请求的时间唤醒,但奇怪的是 Windows 在时间到来之前唤醒。看看我的输出:

Tick = 15
Tick = 16
Tick = 16
Tick = 31
Tick = 15
Tick = 16
Tick = 15
Tick = 16
Tick = 31

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

【问题讨论】:

  • 你的时间太细了。它不是那么准确。尝试更长的时间,这似乎根本不是问题。
  • Windows 中有许多不同的“睡眠”和“获取时间”API。它们并不总是与同一个时钟同步。也许如果您公开了您真正想要做的事情,这需要如此精确的时间,我们可以为您提供更好的建议。
  • 我不介意它有多准确,我只是惊讶地发现差异低于我要求的间隔。
  • 您应该阅读文档Windows Timer Coalescing (Web View)。它解释了你的观察。

标签: c windows winapi internals


【解决方案1】:

操作系统具有特定的线程调度量,这会影响线程等待的准确性。它默认为 15 毫秒,因此 20 的睡眠将在它之前或之后结束。这是“设计使然”。

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

您应该使用waitable timer events 而不是 Sleep,但是当线程停止时,您仍将受到线程调度量的影响以确保准确性。

【讨论】:

    猜你喜欢
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    相关资源
    最近更新 更多