我正在总结一种情况,即具有事件超时的WaitForSingleObjectEx没有返回“信号”,但是超时还没有过去。
具体来说,为了在Qt中调试这个问题,我更改了这段代码。
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;
}其中event是通过CreateEvent(0, FALSE, FALSE, 0);创建的。
强调此代码路径会打印如下语句:
Waited for 96734 microseconds when asked for 100 msecs是否允许WaitForSingleObjectEx早起,即在指定的超时之前(由于内核或类似技术中的计时器合并),还是应该在其他地方研究我的问题?文档并不能帮助我澄清这一点。
发布于 2016-07-21 16:04:39
基于等待函数和超时间隔的MSDN
指定超时间隔的准确性取决于系统时钟的分辨率.系统时钟以恒定的速度“滴答”。如果超时间隔小于系统时钟的分辨率,则等待时间可能小于指定的时间长度()。如果超时间隔大于一个滴答,但小于两个,则等待时间可以介于一到两个滴答之间,以此类推。 为了提高等待函数的超时间隔的准确性,调用timeGetDevCaps函数确定支持的最小定时器分辨率,调用timeBeginPeriod函数将计时器分辨率设置为最小。调用timeBeginPeriod时要小心,因为频繁调用会显著影响系统时钟、系统电源使用和调度程序。如果调用timeBeginPeriod,请在应用程序的早期调用它,并确保在应用程序的末尾调用timeEndPeriod函数。
https://stackoverflow.com/questions/38507918
复制相似问题