2015-10-30 57 views
0

在我的應用程序中有一個父進程,它會產生子進程。我試圖利用這個父進程來監視孩子,以確保GUI保持響應,如果沒有,生成一個轉儲文件。檢測子進程是否掛起父進程

我遇到的問題是Process.Responding只能檢測一些圖形用戶界面掛起(例如在GUI線程或堆棧溢出)而不是其他(例如GUI線程上的死鎖)。

所以問題是:我還能如何檢查孩子的GUI是否仍然從父進程更新?

編輯:基於迄今爲止的意見,我想我應該澄清。我負責使用插件體系結構來維護應用程序的框架,該插件體系結構非常多線程,並且擁有數十萬行代碼的代碼庫,其中大部分代碼不受我控制。雖然我理解理想的方法不是首先掛起,但它偶爾也會發生。我希望能夠平穩地收集這些情況並收集調試信息,以便解決問題。

我考慮的另一種方法是使用GUI線程來觸摸文件,並讓父進程檢查文件的時間戳。但是,我寧願不在GUI線程上執行文件操作。

+2

如果您使用多個線程,請嘗試使用異步並等待與「主線程」不相關的進程。 – darkndream

+1

爲什麼在UI線程上運行代碼可能會死鎖?如果您必須在您的程序中創建一個程序來監視它是否掛起,這是一個不好的跡象。 – Loathing

+0

我總是使用log4net進行日誌記錄。它顯示時間戳和線程號,以便您知道您在哪個過程中停留。 https://logging.apache.org/log4net/release/example-apps.html –

回答

1

幾失敗後與我上面提到的戰略企圖,這裏就是我結束瞭解決這個:

  1. 在孩子申請開始我保存到GUI線程
  2. 開始計時,一個參考定期檢查 GUI線程的線程狀態(大約每200ms)。如果它是ThreadState.Running,則我通過 進程間通信報告進程作爲對父進程的響應。
  3. 在父進程中,我保存進程ID 的字典以及進程上次報告爲響應的時間。如果一個 孩子仍然存活但尚未在 超時期內報告響應結果,則會通知用戶該過程不是 響應。

到目前爲止,一切似乎都按照我預期的那樣工作。