2009-09-21 95 views
1

我有一個MFC應用程序,產生了許多不同的工作線程,並與VS2003編譯。正在顯示斷言對話框時處理Windows消息?

當調用CTreeCtrl :: GetItemState()我偶爾會得到一個調試斷言對話框彈出。我假設這是因爲我已經通過了一個無效項目的句柄,但這不是我的直接擔憂。

我的問題是:從我的日誌中,看起來好像MFC線程繼續在顯示斷言對話框時服務多個Windows消息。我認爲assert對話框是模態的,所以我想知道這是甚至可能嗎?

+0

你確定你沒有看到其他線程處理線程消息嗎? – 2009-09-21 12:14:15

+0

我的日誌包含線程ID,它似乎是服務On ***消息並調用GetItemState() – 2009-09-21 12:38:53

回答

2

顯示斷言失敗的消息框具有用於其自身目的的消息泵。但它會派發所有進入的消息,而不僅僅是消息框的消息(否則可能會被阻止)。

對於正常的模式對話框,這不是問題,因爲父窗口通常在對話期間被禁用。

啓動斷言對話框的代碼一定未能找出父窗口,因此未被禁用。如果您的主窗口在斷言時不是活動窗口,則會發生這種情況。其他事情也可能出錯。

您可以更改Visual Studio的C運行時庫如何通過_CrtSetReportMode報告斷言失敗。您可以停止在調試器中和/或登錄到輸出窗口,而不是嘗試顯示對話框。

+0

的同一線程感謝您的解釋,這聽起來完全合理。 我喜歡使用_CrtSetReportMode讓軟件做一些比拋出一個對話框更好的想法,但不幸的是它運行在沒有安裝Visual Studio的獨立PC上。 – 2009-09-23 12:53:49

+0

我認爲這是在你的開發機器上,因爲你已經啓用了斷言。 – 2009-09-23 17:12:53

2

對話框(即使是消息框)也需要抽取消息隊列,即使它們是模態的。否則他們會如何知道您點擊了「確定」按鈕?

如果您需要時斷言觸發它通常不是太難寫自己實現assert()(或ASSERT()或其他)如果你想打破這將中斷到調試而不是顯示詢問一​​個消息的停止一切到調試器(也許只有當它確定調試器被連接時)。