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

标签 winapi mfc

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

如果是这样,模式对话框的存在如何影响主应用程序的消息循环?两者并行运行,其中一个优先吗?

我遇到一种情况,模式对话框似乎在等待某些内容时卡住了几秒钟,并且想知道对话框是否可能被迫等待,直到主应用程序线程不忙?

最佳答案

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

WinMain
    YourMainMessageLoop
        DispatchMessage
            SomeMessageHandler
                DoModal

DoModal 在自己的 GetMessage/TranslateMessage/DispatchMessage 循环中旋转。主消息循环(上面示例堆栈中的YourMainMessageLoop)是“事件的”,因为它仍在运行,但它被对话框的消息循环阻止。在 DoModal 退出之前,执行不会返回到 YourMainMessageLoop

请注意,即使您处于模式对话框的消息循环中,您的其他窗口仍将处理消息,因为 GetMessageDispatchMessage 仍将检索消息并将消息定向到这些窗口窗口并调用其 WndProc

关于winapi - 模式对话框的消息泵如何与主应用程序消息泵交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26741841/

相关文章:

c++ - 如何通过 MFC 将应用程序设置保存在注册表中?

c++ - 如何知道 DeferWindowPos() 是否导致重新分配?

c++ - 实现符合 CEN-XFS 的新服务提供 (SP)

winapi - 如何使用 MFC 或 GDI 或 GDI+ 为位图中的所有像素设置 alpha 值

c++ - MFC 窗口工具栏创建失败且没有错误消息

c++ - MFC VC++:CMFCButton::SetFaceColor 不更改背景(脸部)颜色

winapi - WTSRegisterSessionNotification 有时在 XP home 启动时不起作用

c - 为什么某些 WinAPI 函数需要将结构的大小作为参数传递?

c++ - 使用地址作为标量值

mfc - 如何防止调用CComboBox::ShowDropDown后鼠标光标被隐藏?