当我使用等待非信号事件时等待单个对象函数中,我发现在某些情况下调用会在小于指定的超时期限内返回 WAIT_TIMEOUT。只需在超时设置为 1000 毫秒的情况下循环调用,我就看到调用在低至 990 毫秒的时间内返回(在 WinXP 上运行)。我在用着查询性能计数器获得独立于系统时钟的时间测量,所以我认为时钟漂移可能不是答案。
这种行为不会给我带来任何实际问题,但我想更好地理解它。看起来它可能以大约计时器滴答的分辨率工作。 Microsoft 是否发布了有关此函数精度的更多详细信息?我应该期待 Vista 中更高的精度吗?
是的,WaitForSingleObject 使用计时器刻度分辨率,它不使用像 QueryPerformanceCounter 这样的高分辨率计时器。
http://msdn.microsoft.com/en-us/library/ms687069(VS.85).aspx http://msdn.microsoft.com/en-us/library/ms687069(VS.85).aspx,关于“等待函数”的 MSDN 文章对此进行了扩展:
指定超时的准确度
间隔取决于分辨率
系统时钟。系统时钟
以恒定的速率“滴答”。如果
超时间隔小于
系统时钟的分辨率,
等待可能会在小于
指定的时间长度。如果
超时间隔大于一
勾选但少于两个,等待即可
介于一到两个刻度之间,
等等。
本文还解释了如何使用 timeBeginPeriod 来提高系统时钟分辨率 - 但不建议这样做。
我可以想到几个原因。首先,几乎所有 WaitForSingleObject 用例都不需要更高的分辨率。使用高分辨率定时器需要内核不断轮询定时器(不可行,因为不能保证内核代码始终运行)或频繁重新编程以生成中断(因为可能有多个 WaitForSingleObjects,并且很可能只有一个)可编程中断)。
另一方面,已经有一个可以不断更新的定时源,其分辨率对于 WaitForSingleObject、SetWaitableTimer 和 Sleep 来说已经足够好了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)