Question

J'écrit une routine de gestionnaire d'exception qui nous aide à capturer des problèmes avec notre logiciel. J'utilise

SetUnhandledExceptionFilter();

pour intercepter toutes les exceptions non rattrapées, et cela fonctionne très bien.

Cependant, mon gestionnaire de pop une boîte de dialogue demandant à l'utilisateur de détail ce qu'ils faisaient au moment de l'accident. C'est là le problème vient, parce que le dialogue est dans le même contexte de fil comme l'accident, la boîte de dialogue continue à pomper les messages d'application. Cela me pose un problème, comme l'un de nos accidents est dans un WM_TIMER, qui se déclenche à chaque minute. Comme vous pouvez l'imaginer, si le dialogue est à l'écran pendant plus d'une minute, un WM_TIMER est envoyé et les app re-accidents. Regagner le gestionnaire d'exception dans cette situation est de mauvaises nouvelles.

Si je laisse de Windows gérer l'accident, Windows affiche une boîte de dialogue qui semble fonctionner, mais arrête les messages se propagent au reste de l'application, d'où le WM_TIMER ne soit pas délivré à nouveau.

Est-ce que quelqu'un sait comment je peux obtenir le même effet?

Merci Rich

Était-ce utile?

La solution

Peut-être que vous pourriez lancer un processus de collecte de données distinct à l'aide CreateProcess() lorsque vous détectez une exception non gérée. Ce processus distinct serait invite l'utilisateur à entrer des informations sur ce qu'ils ne faisaient que, alors que votre application principale peut continuer à se bloquer et se terminer.

Par ailleurs, si vous ne voulez pas lancer un autre processus, vous pourriez peut-être créer une autre fil avec une file d'attente de message séparé, qui bloque votre fil conducteur de faire quoi que ce soit alors que le dialogue est l'écran. Bien que votre thread principal est bloqué, il ne sera pas l'occasion de traiter les messages de WM_TIMER.

Autres conseils

Afficher la boîte de dialogue dans un second fil. J'avais plus ou moins le même problème (mais a dû montrer une boîte de message plutôt que d'une boîte de dialogue).

  • Ecrire une classe dans laquelle vous créez deux événements à l'aide de la fonction CreateEvent Win32. Un événement (déclencheur) est utilisé pour déclencher la boîte de dialogue, un événement (prêt) est à signaler que le dialogue a été traité.
  • Ajouter une méthode « Execute » à la classe et commencer à cette méthode dans un second fil
  • Soit la méthode « exécuter » attendre jusqu'à ce que l'événement déclencheur est réglé, et si elle est définie montrer la boîte de dialogue
  • Une fois la boîte de dialogue a été traitée, définissez l'événement « prêt ».
  • Si votre application se bloque dans le thread principal, préparer des informations pour la boîte de dialogue (via setters dans la classe) et définir l'événement « déclencheur », puis attendre l'événement « prêt ». Le set'ting de l'événement déclencheur activera le second fil, et le fil conducteur bloque jusqu'à ce que le deuxième thread a mis l'événement « prêt »
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top