我的理解是任何模式对话框都会自动拥有自己的消息泵,在专用于该对话框的线程上运行 - 是这样吗?
如果是这样,模式对话框的存在如何影响主应用程序的消息循环?两者并行运行,其中一个优先吗?
我遇到一种情况,模式对话框似乎在等待某些内容时卡住了几秒钟,并且想知道对话框是否可能被迫等待,直到主应用程序线程不忙?
最佳答案
正如 IInspectable 所解释的,模式对话框将在与调用者相同的线程中运行。因此,如果您从具有主消息循环的主 UI 线程运行该对话框,您最终会得到一个嵌套的消息循环。堆栈看起来像这样:
WinMain
YourMainMessageLoop
DispatchMessage
SomeMessageHandler
DoModal
和 DoModal
在自己的 GetMessage
/TranslateMessage
/DispatchMessage
循环中旋转。主消息循环(上面示例堆栈中的YourMainMessageLoop
)是“事件的”,因为它仍在运行,但它被对话框的消息循环阻止。在 DoModal
退出之前,执行不会返回到 YourMainMessageLoop
。
请注意,即使您处于模式对话框的消息循环中,您的其他窗口仍将处理消息,因为 GetMessage
和 DispatchMessage
仍将检索消息并将消息定向到这些窗口窗口并调用其 WndProc
。
关于winapi - 模式对话框的消息泵如何与主应用程序消息泵交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26741841/