WaitForSingleObject的超时解决方案

Chr*_*oer 12 winapi

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

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

Mic*_*ael 10

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

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

指定超时间隔的准确性取决于系统时钟的分辨率.系统时钟以恒定速率"滴答".如果超时间隔小于系统时钟的分辨率,则等待可能会在小于指定的时间长度内超时.如果超时间隔大于一个刻度但小于两个,则等待可以是一到两个刻度之间的任何位置,依此类推.

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

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

另一方面,已经存在一个定时源,它的分辨率不断更新,对于WaitForSingleObject,SetWaitableTimer和Sleep来说已经足够好了.