首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >允许WaitForSingleObjectEx早起吗?

允许WaitForSingleObjectEx早起吗?
EN

Stack Overflow用户
提问于 2016-07-21 15:08:49
回答 1查看 505关注 0票数 2

我正在总结一种情况,即具有事件超时的WaitForSingleObjectEx没有返回“信号”,但是超时还没有过去。

具体来说,为了在Qt中调试这个问题,我更改了这段代码

代码语言:javascript
复制
bool QMutexPrivate::wait(int timeout)
{
    return (WaitForSingleObjectEx(event, timeout < 0 ? INFINITE : timeout, FALSE) == WAIT_OBJECT_0);
}

对此代码(其中包括测量):

代码语言:javascript
复制
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;
}

其中event是通过CreateEvent(0, FALSE, FALSE, 0);创建的。

强调此代码路径会打印如下语句:

代码语言:javascript
复制
Waited for 96734 microseconds when asked for 100 msecs

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-21 16:04:39

基于等待函数和超时间隔的MSDN

指定超时间隔的准确性取决于系统时钟的分辨率.系统时钟以恒定的速度“滴答”。如果超时间隔小于系统时钟的分辨率,则等待时间可能小于指定的时间长度()。如果超时间隔大于一个滴答,但小于两个,则等待时间可以介于一到两个滴答之间,以此类推。 为了提高等待函数的超时间隔的准确性,调用timeGetDevCaps函数确定支持的最小定时器分辨率,调用timeBeginPeriod函数将计时器分辨率设置为最小。调用timeBeginPeriod时要小心,因为频繁调用会显著影响系统时钟、系统电源使用和调度程序。如果调用timeBeginPeriod,请在应用程序的早期调用它,并确保在应用程序的末尾调用timeEndPeriod函数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38507918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档