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

时间:2015-10-13 10:47:10

标签: c++ qt winapi

我正在调试其他人的程序,偶尔会遇到困难。我能够重现其中一个卡住的时刻。当我让程序卡住并暂停时,我看到了这段代码,它是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,没有帮助)?

1 个答案:

答案 0 :(得分:2)

任何空闲的Windows应用程序都会被卡住&#34;在此或类似的API调用中。 它不表示有任何错误,这是正确的行为! MsgWaitForMultipleObjectsEx调用将在应用程序有新的事件通知时立即返回,例如当你尝试与它交互时,如果该线程是GUI线程。