模态对话框的消息泵如何与主应用程序消息泵交互?

时间:2014-11-04 17:58:31

标签: winapi mfc

我的理解是任何模态对话框都会自动拥有自己的消息泵,在专用于该对话框的线程上运行 - 是吗?

如果是这样,模态对话框的存在如何影响主应用程序的消息循环?两者并行运行,是否优先考虑?

我遇到这样一种情况:模态对话框似乎卡住了几秒钟等待某事,并且想知道对话框是否可能被迫等到主应用程序线程不忙?

1 个答案:

答案 0 :(得分:4)

正如IInspectable所解释的那样,模态对话框将在与调用者相同的线程中运行。因此,如果从具有主消息循环的主UI线程运行对话框,您将最终得到嵌套的消息循环。堆栈看起来像:

WinMain
    YourMainMessageLoop
        DispatchMessage
            SomeMessageHandler
                DoModal

DoModal在其自己的GetMessage / TranslateMessage / DispatchMessage循环中旋转。主消息循环(上面的示例堆栈中的YourMainMessageLoop)在它仍在运行的意义上是“活动的”,但它是由对话框的消息循环阻塞。在YourMainMessageLoop退出之前,执行不会返回DoModal

请注意,即使您在模态对话框的消息循环中,您的其他窗口仍将处理消息,因为GetMessageDispatchMessage仍将检索并将消息定向到这些窗口并调用它们{{ 1}} S上。