2010-02-19 229 views
2

我編寫了一個異常處理程序例程,可以幫助我們發現我們的軟件問題。我使用C++異常處理程序問題

SetUnhandledExceptionFilter(); 

捕捉任何未捕獲的異常,它工作得很好。

但是我的處理程序彈出的一個對話框,詢問用戶細節,他們在崩潰的時候在做什麼。這是問題出現的地方,因爲對話與崩潰在同一個線程上下文中,對話框繼續抽取應用程序的消息。這會導致我一個問題,因爲我們的一個崩潰是在WM_TIMER中,每隔一分鐘就會關閉。正如你可以想象的那樣,如果對話已經在屏幕上超過了一分鐘,WM_TIMER就會被調度並且應用程序重新崩潰。在這種情況下重新進入異常處理程序是個壞消息。

如果我讓Windows處理崩潰,Windows會顯示出現起作用的對話,但停止傳播到應用程序的其餘部分的消息,因此WM_TIMER沒有得到重發。

有誰知道我怎樣才能達到同樣的效果?

感謝 豐富

回答

2

也許你可以使用CreateProcess()當您發現有未處理的異常發起一個獨立的數據收集過程。這個單獨的過程將提示用戶輸入他們剛剛在做什麼的信息,而主應用程序可能會繼續崩潰並終止。

或者,如果您不想啓動另一個進程,則可以使用單獨的消息隊列創建另一個線程,該對話框在屏幕上時阻止主線程執行任何操作。當您的主線程被阻止時,它將不會有機會處理WM_TIMER消息。

+0

好主意。這個單獨的應用程序然後可以進一步擴展,而無需擴展你的應用例如。發送郵件與信息,發佈信息的Web服務,... – Patrick 2010-02-19 10:22:20

+1

我認爲推出一個單獨的進程將是最好的事情。通過這種方式,您甚至不必擔心異常會如此糟糕,以至於任何嘗試恢復它/顯示對話框/ ......都會導致進一步的損壞。您也可以考慮在啓動崩潰報告應用程序後凍結您的進程,以便它可以從「外部」創建核心轉儲,然後終止它。 – 2010-02-19 10:52:36

+0

謝謝,目前創建一個線程已經解決了這個問題。不過,我可以看到創建過程的優勢。 – Rich 2010-02-19 11:30:21

0

顯示在第二個線程的對話框。 我或多或少有同樣的問題(但不得不顯示消息框而不是對話框)。

  • 編寫一個類,使用Win32 CreateEvent函數創建兩個事件。一個事件(觸發器)用於觸發對話,一個事件(就緒)表示對話已處理。
  • 添加一個方法「執行」到類,直到觸發事件被設置在第二螺紋
  • 讓「執行」方法等待而開始這個方法,如果它被設置顯示對話框
  • 後,對話框已被處理,請設置'就緒'事件。
  • 如果在主線程的應用程序崩潰,準備對話的一些信息(通過在類制定者),並設置了「觸發」事件,然後等待「就緒」事件。觸發事件的設置將激活第二個線程,並且主線程將阻塞,直到第二個線程已經設置'就緒'事件爲止