2009-06-12 8 views
7

He estado usando Google Chrome por un tiempo y noté que tiene un control de bloqueo muy elegante.Predecir que el programa fallará

Justo antes de colgarse, google chrome dio un mensaje que decía "Woah! Google Chrome se ha bloqueado. ¿Desea reiniciar ahora?". Y justo después, obtendría un Windows XP estándar "Este programa ha encontrado un problema y debe cerrarse". con los botones "Depurar", "No enviar" y "Enviar informe de errores".

Mi pregunta es cómo puede programar su aplicación compilada para detectar una condición de bloqueo de antemano? Si tiene conocimiento de cómo hacerlo en cualquier lenguaje de programación/plataforma sería genial.

Gracias

+6

Al primer vistazo a esta pregunta, me pregunté si esto iba a ser sobre si Google había resuelto el problema de detención ... –

Respuesta

16

Google Chrome utiliza una técnica (a menudo llamado separación proceso), donde la interfaz de usuario 'anfitrión' gestiona procesos hijo que pueda detectar deje de responder (o peor aún, lanzando un error y cierre). Comienza un nuevo proceso para cada pestaña que abre.

Here's an article describiendo esto con un poco más de detalle.

Utilizando .net Process clase, puede iniciar procesos, comprobar si son receptivos e incluso matarlos.

Si desea incrustar una ventana de proceso dentro de la suya, puede usar funciones de plataforma como SetParent para mover una ventana dentro de otra. Me temo que no conozco una alternativa administrada a SetParent cuando trabajo con Formularios, pero sospecho que existe, por lo que vale la pena buscarlo antes de usar SetParent.

Si el proceso de host se bloquea, simplemente usar algo como AppDomain.CurrentDomain.UnhandledException le permitirá recibir una notificación de que se ha producido una excepción de nivel superior, pero en esta etapa es poco probable que pueda predecir el estado de los objetos dentro de su la aplicación y el reinicio (junto con algunos registros y notificaciones para el usuario) es probablemente la única opción sensata.

Manejando las excepciones de nivel superior es covered in detail here.

4

En .NET, puede conectarse al evento System.AppDomain.CurrentDomain.UnhandledException. Su código sería algo como esto:

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!"); 
    } 
} 
+0

Bueno, siempre me gusta ver algunas muestras de código cuando alguien responde una pregunta. –

+0

Necesita hacer más que eso, consulte http://www.danielmoth.com/Blog/2004/08/global-exception-handling-net-v11-part.html – mhenry1384

12

No conozco el código de Google, así que estoy especulando. Google Chrome probablemente no está pronosticando que se bloqueará, sino que detectará que se ha bloqueado.

En Windows puede hacer esto proporcionando un controlador para todas las excepciones no controladas. En este controlador, puede hacer cosas como reiniciar la aplicación, crear un archivo de minivolcado, etc.

Eche un vistazo a SetUnhandledExceptionFilter Function para obtener un método.

+3

Tenga en cuenta que el motivo por el que aparece la ventana de depuración de Windows luego es que Google sigue adelante y arroja el error al sistema operativo después de terminarlo. – NotMe

+0

tipo de. Está detectando que uno de sus procesos secundarios se colgó. –

3

Hay una API de reinicio. Daniel Moth has blogged about it here y here. Tenga en cuenta que no estoy diciendo que esta sea la forma en que funciona Google Chrome, solo que es algo que debería considerar.

Creo que también podría cargar bits de la aplicación en el App Domains. Creo que esto es lo que es .NET 3.5 Addin framework uses, aunque no puedo decir que alguna vez lo haya usado (simplemente lea sobre él). Parece que Daniel tiene blogged about this too.

Cuestiones relacionadas