我正在调试别人的程序,这个程序偶尔会卡住。我能够重现一个卡住的时刻。当我让程序卡住并暂停它时,我看到这段代码,它是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,没有帮助)?
任何空闲的Windows应用程序都将"卡"在此或类似的API调用中。这不是任何错误的指示,这是正确的行为! MsgWaitForMultipleObjectsEx
调用将返回,只要有新的事件通知可用的应用程序,例如,当你试图与它交互,如果线程是GUI线程