debugging - programacion - ¿Cómo finalizar inmediatamente la aplicación bloqueada?
manual de programacion android pdf (3)
Tengo una aplicación que a veces causa excepciones. Y necesito reiniciarlo si se cuelga. Pero el problema es que tengo Windows 7 aquí y cuando la aplicación falla, Windows me muestra un bonito cuadro de diálogo con una sugerencia para cerrar la aplicación. Pero la aplicación en sí sigue ejecutándose hasta que haga clic en "Cerrar". ¿Cómo deshacerse de esta ventana y hacer que la aplicación finalice inmediatamente sin ningún cuadro de diálogo?
Puede usar el concepto del Dr. Watson para detectar el bloqueo y reiniciar la aplicación. Use lo siguiente:
Establezca un temporizador como:
SetTimer( eIsDwwin, 30000, NULL);
Esto verificará el proceso del Dr. Watson cada 30 segundos en el proceso del sistema usando lo siguiente:
void CMainFrame::OnTimer(UINT nIDEvent) {
case eIsDwwin:
HANDLE hndl = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
DWORD dwsma = GetLastError();
DWORD dwExitCode = 0;
PROCESSENTRY32 procEntry={0};
procEntry.dwSize = sizeof( PROCESSENTRY32 );
Process32First(hndl,&procEntry);
do {
if(((!strcmpi(procEntry.szExeFile,"dwwin.exe"))||
(!strcmpi(procEntry.szExeFile,"drwatson.exe"))||
(!strcmpi(procEntry.szExeFile,"drwtsn32.exe"))||
(!strcmpi(procEntry.szExeFile,"WerFault.exe"))) &&
(procEntry.th32ParentProcessID == GetCurrentProcessId())) {
WSACleanup();
PostMessage( WM_CLOSE);
Sleep(500);
if(0==strcmpi(procEntry.szExeFile,"dwwin.exe")) {
system("TASKKILL /IM dwwin.exe /F");
} else if(0==strcmpi(procEntry.szExeFile,"drwatson.exe")) {
system("TASKKILL /IM drwatson.exe /F");
} else if(0==strcmpi(procEntry.szExeFile,"drwtsn32.exe")) {
system("TASKKILL /IM drwtsn32.exe /F");
} else if(0==strcmpi(procEntry.szExeFile,"WerFault.exe")) {
system("TASKKILL /IM WerFault.exe /F");
} else {
system("TASKKILL /IM WerFault.exe /F");
}
break;
}
} while(Process32Next(hndl,&procEntry));
CloseHandle(hndl);
break;
}
}
Esto cerrará la aplicación que se ha bloqueado, con gracia.
Otra manera sería usar Signal API en Windows para manejar las excepciones y bloqueos.
No conocer el idioma de su aplicación lo hace un poco difícil, pero normalmente puede manejarlo ejecutando su aplicación dentro del equivalente de un bloque try / catch (como en C #, C ++ o Python). En pseudo-Csharp-ish-code:
bool done = false;
main()
{
while( !done )
{
AppClass aclass = new AppClass();
try
{
aclass->Run();
}
catch( Exception x )
{
LogErrorSomehow(x);
delete aclass;
continue;
}
}
}
Básicamente, la mejor forma de evitar un error de "excepción no controlada" es manejar la excepción atrapándola y tomando las medidas apropiadas (incluso si esa acción no está haciendo nada).
En este ejemplo, si alguien quisiera cerrar su aplicación, establecería el valor "finalizado" en verdadero y regresaría desde Ejecutar ().
Lo ideal sería atrapar todas las excepciones en el ámbito más externo de su programa. Sin embargo, a veces no puede darse el lujo de realizar dichos cambios y los diálogos de bloqueo le impiden recuperarse de un bloqueo. En estos casos, puede considerar deshabilitar el informe de errores de Windows , ya sea completamente o para un programa específico.
En Windows 7: Inicio Orb -> Panel de control -> Centro de acciones -> Mantenimiento -> Buscar soluciones a informes de problemas -> Configuración
Actualización: para deshabilitar por completo la IU de informe de errores, cambie la configuración del registro DontShowUI :
HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / Windows / Windows Error Reporting / DontShowUI