我的理解是任何模态对话框都会自动拥有自己的消息泵,在专用于该对话框的线程上运行 - 是吗?
如果是这样,模态对话框的存在如何影响主应用程序的消息循环?两者并行运行,是否优先考虑?
我遇到这样一种情况:模态对话框似乎卡住了几秒钟等待某事,并且想知道对话框是否可能被迫等到主应用程序线程不忙?
答案 0 :(得分:4)
正如IInspectable所解释的那样,模态对话框将在与调用者相同的线程中运行。因此,如果从具有主消息循环的主UI线程运行对话框,您将最终得到嵌套的消息循环。堆栈看起来像:
WinMain
YourMainMessageLoop
DispatchMessage
SomeMessageHandler
DoModal
和DoModal
在其自己的GetMessage
/ TranslateMessage
/ DispatchMessage
循环中旋转。主消息循环(上面的示例堆栈中的YourMainMessageLoop
)在它仍在运行的意义上是“活动的”,但它是由对话框的消息循环阻塞。在YourMainMessageLoop
退出之前,执行不会返回DoModal
。
请注意,即使您在模态对话框的消息循环中,您的其他窗口仍将处理消息,因为GetMessage
和DispatchMessage
仍将检索并将消息定向到这些窗口并调用它们{{ 1}} S上。