WaitForSingleObject的超时解决方案

时间:2009-05-21 21:21:32

标签: winapi

当我使用 WaitForSingleObject 函数等待未发出信号的事件时,我发现在某些情况下,调用将在少于指定的超时时间内返回WAIT_TIMEOUT。只需在超时设置为1000毫秒的情况下循环调用,我已经看到呼叫返回的时间低至990毫秒(在WinXP上运行)。我正在使用 QueryPerformanceCounter 来获得与系统时钟无关的时间测量,因此我认为时钟漂移可能不是一个答案。

这种行为对我来说没有任何实际问题,但我想更好地理解它。看起来它可能大致在计时器滴答的分辨率下工作。 Microsoft是否会发布有关此功能精度的更多详细信息?我应该期待Vista的更高精度吗?

1 个答案:

答案 0 :(得分:9)

是的,WaitForSingleObject使用计时器滴答分辨率,它不使用像QueryPerformanceCounter这样的高分辨率计时器。

http://msdn.microsoft.com/en-us/library/ms687069(VS.85).aspx,关于“等待函数”的MSDN文章对此进行了扩展:

  

指定超时的准确性   间隔取决于分辨率   系统时钟。系统时钟   以固定的速度“嘀嗒”。如果   超时间隔小于   解析系统时钟,   等待可能会超过时间   指定的时间长度。如果   超时间隔大于1   嘀嗒但不到两个,等待即可   在一到两个刻度之间,   等等。

本文还介绍了如何使用timeBeginPeriod来提高系统时钟分辨率 - 但不建议这样做。

我可以想到几个原因。首先,几乎所有WaitForSingleObject用例都不需要更高的分辨率。使用高分辨率计时器需要内核不断轮询定时器(不可行,因为内核代码不能保证始终运行)或经常重新编程以生成中断(因为可能有多个WaitForSingleObjects,很可能只有一个可编程中断)。

另一方面,已经有一个定时源可以不断更新,其分辨率对于WaitForSingleObject,SetWaitableTimer和Sleep来说已经足够好了。