【发布时间】: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