Qt应用程序永久停留在MsgWaitForMultipleObjectsEx.这是什么意思?



我正在调试别人的程序,这个程序偶尔会卡住。我能够重现一个卡住的时刻。当我让程序卡住并暂停它时,我看到这段代码,它是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线程

最新更新