12
votes

Comment mettre fin immédiatement à une application écrasée?

J'ai une application qui provoque parfois des exceptions. Et j'ai besoin de le redémarrer s'il s'est écrasé. Mais le problème est que je possède Windows 7 ici et lorsque l'application se bloque, Windows me montre une belle boîte de dialogue avec une suggestion pour fermer l'application. Mais l'application elle-même est toujours en cours d'exécution jusqu'à ce que je clique "Fermer". Comment se débarrasser de cette fenêtre et faire une demande immédiatement sans aucune boîte de dialogue?


2 commentaires

Une autre solution utile est le paramètre de registre HKEY_CURrent_USER \ Control Panel \ Desktop Créer une entrée REG_SZ nommée AutoendTasks et la définir sur 1


Ensuite, la question devient: comment terminer immédiatement l'application spécifique (ID de processus)?


3 Réponses :


0
votes

Ne pas savoir que la langue de votre application le rend un peu difficile, mais vous pouvez généralement gérer cela en exécutant votre application dans l'équivalent d'un bloc d'essai / prise (comme dans C #, C ++ ou Python). Dans pseudo-csharp-ish-code: xxx

essentiellement, le meilleur moyen de contourner une erreur "exception non manquée" est de gérer l'exception en l'attrapant et en prenant des mesures appropriées (même si cela L'action ne fait rien).

Dans cet exemple, si quelqu'un voulait fermer votre application, vous définissez la valeur "Terminée" sur true et revenir de l'exécution ().


1 commentaires

La demande de collision n'est pas la mienne.



14
votes

Idéalement, vous attraperiez toutes les exceptions dans la portée la plus extérieure de votre programme. Cependant, parfois, vous n'avez pas le luxe de faire de tels changements et que les boîtes de dialogue des collisions vous empêchent de récupérer d'un crash. Dans ces cas, vous pouvez envisager de désactiver Rapport d'erreur Windows , entièrement ou pour un programme spécifique.

Sous Windows 7: Démarrer Orb -> Panneau de configuration -> Centre d'action -> Maintenance -> Rechercher des solutions aux rapports de problèmes -> Paramètres

MISE À JOUR: Pour désactiver complètement les erreurs Rapport d'erreur, UI Modifiez le Dontshowui Cadre de registre:

HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ Windows Reporting \ Dontshowui


4 commentaires

Ce n'est pas ma candidature, qui se bloque. Et ce rapport est désactivé. Mais Windows affiche toujours la boîte de dialogue informatique, qui empêche l'exécutable écrasé de la résiliation jusqu'à ce que vous appuyez sur OK.


Mise à jour de la réponse pour inclure un paramètre de registre.


J'ai aussi une application qui n'est pas la mienne qui se bloque parfois. J'aimerais m'assurer que lorsqu'il se bloque, il se termine automatiquement sans demander à l'utilisateur la touche d'appuyer sur une fenêtre de notification.


Pour désactiver les signaler des erreurs, définissez DONTSHOWUI sur DWORD 0



1
votes

Vous pouvez utiliser le concept du Dr Watson pour détecter le crash et redémarrer l'application. Utilisez ce qui suit:

Définir une minuterie comme: p>

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;
    }
}


0 commentaires