MessageBox上的程序冻结()

时间:2011-06-07 16:06:31

标签: windows visual-studio winapi visual-c++ mfc

问题在于:主GUI线程正在向另一个GUI线程执行SendMessage(是的,有多个GUI线程,不幸的是这不会改变)。当第二个GUI线程收到SendMessage时,它可能决定显示一个消息框。有些时候,MessageBox将“冻结”整个应用程序。

更具体地说,消息框显示,但整个GUI挂起(用户输入无法在任何地方工作)。

我已经使用调试器验证了第二个GUI线程正在user32.dll中定义的DialogBox2()函数中旋转。我可以在反汇编中看到正在执行消息泵(我看到正在调用IsDialogMessage / TranslateMessage / DispatchMessage)。使用spy ++,我没有看到消息对话框窗口正在处理任何消息。我确实看到在主GUI窗口上处理消息(例如WM_SETCURSOR,虽然我没有处理它们正在处理,因为我认为SendMessage不执行消息泵)。

第二个线程正在执行代码,该代码是MFC扩展DLL的一部分,如果这很重要。

我尝试过使用AfxMessageBox()/ CWnd :: MessageBox / :: MessageBox(NULL父窗口,...)。所有人都表现出同样的问题。

以前有人见过类似的东西吗?

谢谢, 安德鲁

1 个答案:

答案 0 :(得分:1)

必须阻止其中一个GUI线程导致问题。

试试这个:

将:: SendMesage替换为:: PostMessage,后跟:: MsgWaitForMultipleObjects循环。您需要传递一个事件句柄,以便在消息框关闭时发出信号。

它可能会解决问题。

请注意您在自己发送的消息:: MsgWaitForMultipleObjects循环。