我一直在使用谷歌瀏覽器一段時間,我注意到它具有非常優雅的崩潰控制功能。預測程序崩潰
就在崩潰之前,谷歌瀏覽器給出了一條消息:「哇!谷歌瀏覽器崩潰了,現在重新啓動?」。之後,我會得到一個標準的Windows XP「這個程序遇到了問題,需要關閉。」與「調試」,「不發送」和「發送錯誤報告」按鈕。
我的問題是你如何編程你的編譯應用程序來提前檢測到崩潰情況?如果你在任何編程語言/平臺上知道如何做到這一點,那就太棒了。
感謝
我一直在使用谷歌瀏覽器一段時間,我注意到它具有非常優雅的崩潰控制功能。預測程序崩潰
就在崩潰之前,谷歌瀏覽器給出了一條消息:「哇!谷歌瀏覽器崩潰了,現在重新啓動?」。之後,我會得到一個標準的Windows XP「這個程序遇到了問題,需要關閉。」與「調試」,「不發送」和「發送錯誤報告」按鈕。
我的問題是你如何編程你的編譯應用程序來提前檢測到崩潰情況?如果你在任何編程語言/平臺上知道如何做到這一點,那就太棒了。
感謝
谷歌Chrome瀏覽器使用的技術(通常被稱爲過程分離),其中「主機」界面管理子進程,它可以檢測不響應(或更糟的是,拋出一個錯誤和關閉)。它會爲您打開的每個選項卡啓動一個新的過程。
Here's an article更詳細地描述了這一點。
使用.net的Process類,您可以啓動進程,檢查它們是否響應,甚至殺死它們。
如果您想在您自己的窗口中嵌入進程窗口,可以使用平臺函數(如SetParent)將窗口移到另一個窗口中。恐怕在使用窗體時,我並沒有意識到SetParent的託管替代方案,但我懷疑存在,因此在使用SetParent之前值得搜索。
如果主機進程崩潰,只需使用諸如AppDomain.CurrentDomain.UnhandledException
之類的東西就可以接收到發生頂級異常的通知,但到目前爲止,您不可能預測您的內部對象的狀態應用程序和重新啓動(以及一些日誌記錄和通知給用戶)可能是您唯一明智的選擇。
處理頂級例外是covered in detail here。
在.NET中,您可以連接到System.AppDomain.CurrentDomain.UnhandledException事件。你的代碼看起來像這樣:
using System;
using System.Windows.Forms;
public class Program
{
public static void Main(string[] args)
{
AppDomain.CurrentDomain.UnhandledException += MyUnhandledExceptionHandler;
// start rest of application
}
private static void MyUnhandledExceptionHandler(object sender, EventArgs args)
{
MessageBox.Show("Your app is crashing. Watch out!");
}
}
不錯 - 我總是喜歡在有人回答問題時看到一些代碼示例。 – 2009-11-11 14:52:24
您需要做的不止於此,請參閱http://www.danielmoth.com/Blog/2004/08/global-exception-handling-net-v11-part.html – mhenry1384 2009-12-18 14:31:05
我不知道谷歌的代碼,所以我猜測。谷歌瀏覽器可能不會預測它會崩潰,但檢測到它已經崩潰。
在Windows中,您可以通過爲所有未處理的異常提供處理程序來完成此操作。在此處理程序中,您可能會執行諸如重新啓動應用程序,創建小型文件轉儲文件等。
請查看SetUnhandledExceptionFilter Function獲取一種方法。
有一個重新啓動API。 Daniel Moth has blogged about it here和here。請注意,我並不是說這就是Google Chrome的工作方式,只是它可能是您想要查看的內容。
我相信你也可以在單獨的App Domains加載應用程序的位。我相信這是.NET 3.5 Addin framework uses,雖然我不能說我曾經使用它(只是讀了它)。看起來Daniel有blogged about this too。
第一眼看到這個問題,我想知道這是否會解決Google是否解決了暫停問題...... – 2009-06-12 20:51:45