当我使用 WaitForSingleObject 函数等待未发出信号的事件时,我发现在某些情况下,调用将在少于指定的超时时间内返回WAIT_TIMEOUT。只需在超时设置为1000毫秒的情况下循环调用,我已经看到呼叫返回的时间低至990毫秒(在WinXP上运行)。我正在使用 QueryPerformanceCounter 来获得与系统时钟无关的时间测量,因此我认为时钟漂移可能不是一个答案。
这种行为对我来说没有任何实际问题,但我想更好地理解它。看起来它可能大致在计时器滴答的分辨率下工作。 Microsoft是否会发布有关此功能精度的更多详细信息?我应该期待Vista的更高精度吗?
答案 0 :(得分:9)
是的,WaitForSingleObject使用计时器滴答分辨率,它不使用像QueryPerformanceCounter这样的高分辨率计时器。
http://msdn.microsoft.com/en-us/library/ms687069(VS.85).aspx,关于“等待函数”的MSDN文章对此进行了扩展:
指定超时的准确性 间隔取决于分辨率 系统时钟。系统时钟 以固定的速度“嘀嗒”。如果 超时间隔小于 解析系统时钟, 等待可能会超过时间 指定的时间长度。如果 超时间隔大于1 嘀嗒但不到两个,等待即可 在一到两个刻度之间, 等等。
本文还介绍了如何使用timeBeginPeriod来提高系统时钟分辨率 - 但不建议这样做。
我可以想到几个原因。首先,几乎所有WaitForSingleObject用例都不需要更高的分辨率。使用高分辨率计时器需要内核不断轮询定时器(不可行,因为内核代码不能保证始终运行)或经常重新编程以生成中断(因为可能有多个WaitForSingleObjects,很可能只有一个可编程中断)。
另一方面,已经有一个定时源可以不断更新,其分辨率对于WaitForSingleObject,SetWaitableTimer和Sleep来说已经足够好了。