問題出在這裏:主GUI線程正在對另一個GUI線程執行SendMessage(是的,有多個GUI線程,不幸的是這不能改變)。當第二個GUI線程接收到SendMessage時,它可能決定顯示一個消息框。有些時候,MessageBox會「凍結」整個應用程序。程序在MessageBox上死機()
更具體地說,消息框顯示出來,但是整個GUI被掛起(用戶輸入不起作用)。
我已用調試器驗證過第二個GUI線程正在user32.dll中定義的DialogBox2()函數中旋轉。我可以在反彙編中看到消息泵正在執行(我看到IsDialogMessage/TranslateMessage/DispatchMessage被調用)。使用spy ++,我沒有看到消息對話框窗口正在處理任何消息。我確實看到了在主GUI窗口上處理的消息(例如WM_SETCURSOR,儘管我不仔細地處理它們,因爲我相信SendMessage不會執行消息泵)。
第二個線程正在執行作爲MFC擴展DLL的一部分的代碼(如果有的話)。我試過使用AfxMessageBox()/ CWnd :: MessageBox/:: MessageBox(NULL父窗口,...)。所有都表現出同樣的問題。
有沒有人見過類似的東西?
感謝, 安德魯
我在你的問題的第一句話中發現了問題,所以我不確定爲什麼我應該閱讀更多。你正在使用多個GUI線程,你知道這是一個壞主意,你想知道爲什麼你看到不良行爲?嗯。 – 2011-06-07 16:09:25
更重要的是,MessageBox是一個阻塞調用,不管你是否使用由MFC包裝的調用。這意味着它可以防止消息被處理,與您描述的行爲一致。 – 2011-06-07 16:10:41
我明白MessageBox是阻塞的。 MessageBox不應該被凍結(例如,我應該能夠點擊OK來解除它)。正如我所說的,應用程序不能更改爲單個GUI線程。我同意這是一個壞主意,但我沒有寫出來。 – Andrew 2011-06-07 16:16:26