Winapi WaitForSingleObjectEx允许早起吗?

Winapi WaitForSingleObjectEx允许早起吗?,winapi,synchronization,Winapi,Synchronization,我正在总结一个案例,其中事件超时的WaitForSingleObjectEx没有返回“signaled”,但超时还没有过去 具体来说,为了在Qt中调试此问题,我更改了: WaitForSingleObjectEx是否允许提前唤醒,即在指定的超时之前唤醒(由于内核或类似技术中的计时器合并),还是应该在其他地方调查我的问题?这并不能帮助我澄清这一点。MSDN关于: 指定超时间隔的精度取决于系统时钟的分辨率。系统时钟以恒定速率“滴答”作响。如果超时间隔小于系统时钟的分辨率,等待可能在小于指定时间长度的

我正在总结一个案例,其中事件超时的WaitForSingleObjectEx没有返回“signaled”,但超时还没有过去

具体来说,为了在Qt中调试此问题,我更改了:

WaitForSingleObjectEx是否允许提前唤醒,即在指定的超时之前唤醒(由于内核或类似技术中的计时器合并),还是应该在其他地方调查我的问题?这并不能帮助我澄清这一点。

MSDN关于:

指定超时间隔的精度取决于系统时钟的分辨率。系统时钟以恒定速率“滴答”作响。如果超时间隔小于系统时钟的分辨率,等待可能在小于指定时间长度的时间内超时。如果超时间隔大于一个刻度但小于两个刻度,则等待可以在一到两个刻度之间,依此类推

要提高等待函数超时间隔的准确性,请调用timeGetDevCaps函数以确定支持的最小计时器分辨率,并调用timeBeginPeriod函数将计时器分辨率设置为其最小值。调用timeBeginPeriod时请小心,因为频繁的调用会显著影响系统时钟、系统电源使用和计划程序。如果调用timeBeginPeriod,请在应用程序的早期调用它一次,并确保在应用程序的最后调用timeEndPeriod函数


你太快下结论了
result
可能由于多种原因而为false,而不仅仅是超时。实际上,它返回的是
WAIT\u timeout
(通过在代码中调试)。
==WAIT\u OBJECT\u 0
检查以前就在那里。我想它可以变得更强大。
event
是实际Windows事件对象的句柄还是其他同步对象的句柄?@AdrianMcCarthy:正如我在文章中所写,它是由
CreateEvent
返回的。
bool QMutexPrivate::wait(int timeout)
{
    return (WaitForSingleObjectEx(event, timeout < 0 ? INFINITE : timeout, FALSE) == WAIT_OBJECT_0);
}
bool QMutexPrivate::wait(int timeout)
{
    LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds;
    LARGE_INTEGER Frequency;

    QueryPerformanceFrequency(&Frequency);
    QueryPerformanceCounter(&StartingTime);

    auto result = (WaitForSingleObjectEx(event, timeout < 0 ? INFINITE : timeout, FALSE) == WAIT_OBJECT_0);

    QueryPerformanceCounter(&EndingTime);
    ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;

    ElapsedMicroseconds.QuadPart *= 1000000;
    ElapsedMicroseconds.QuadPart /= Frequency.QuadPart;
    if (!result && timeout > 0)
        std::cerr << "Waited for " << ElapsedMicroseconds.QuadPart << " microseconds when asked " << timeout << std::endl;
    return result;
}
Waited for 96734 microseconds when asked for 100 msecs