我正在调试其他人的程序,偶尔会遇到困难。我能够重现其中一个卡住的时刻。当我让程序卡住并暂停时,我看到了这段代码,它是Qt框架的一部分:
// still nothing - wait for message or signalled objects
canWait = (!retVal
&& !d->interrupt
&& (flags & QEventLoop::WaitForMoreEvents));
if (canWait) {
DWORD nCount = d->winEventNotifierList.count();
Q_ASSERT(nCount < MAXIMUM_WAIT_OBJECTS - 1);
for (int i=0; i<(int)nCount; i++)
pHandles[i] = d->winEventNotifierList.at(i)->handle();
emit aboutToBlock();
>BREAKHERE> waitRet = MsgWaitForMultipleObjectsEx(nCount, pHandles, INFINITE, QS_ALLINPUT, MWMO_ALERTABLE | MWMO_INPUTAVAILABLE);
emit awake();
if (waitRet - WAIT_OBJECT_0 < nCount) {
d->activateEventNotifier(d->winEventNotifierList.at(waitRet - WAIT_OBJECT_0));
retVal = true;
}
}
代码停留在MsgWaitForMultipleObjectsEx
。我不认为这是Qt框架或Winapi中的问题(MsgWaitForMultipleObjectsEx
是winapi函数)。我认为应用程序会导致这种情况。
由于我没有使用此功能或Qt的经验,我只想问:MsgWaitForMultipleObjectsEx
被卡住的可能原因是什么?该方法做什么(我读过MSDN,没有帮助)?
答案 0 :(得分:2)
任何空闲的Windows应用程序都会被卡住&#34;在此或类似的API调用中。 它不表示有任何错误,这是正确的行为! MsgWaitForMultipleObjectsEx
调用将在应用程序有新的事件通知时立即返回,例如当你尝试与它交互时,如果该线程是GUI线程。