Question

I ai une application MFC qui engendre un certain nombre de différents threads de travail et est compilé avec VS2003.

Lorsque vous appelez CTreeCtrl :: GetItemState () Je suis parfois obtenir une assertion de débogage de dialogue pop-up. Je suppose que cela est parce que je suis passé dans une poignée à un élément non valide, mais ce n'est pas ma préoccupation immédiate.

Ma préoccupation est: De mes journaux, il semble que le fil MFC continue de gérer un certain nombre de messages de fenêtres alors que la boîte de dialogue assert est affiché. Je pensais que le dialogue assert était modale, donc je me demandais si cela était encore possible?

Était-ce utile?

La solution

La boîte de message qui montre l'échec d'assertion a une pompe de message à ses propres fins. Mais il va expédier tous les messages qui viennent, pas seulement ceux de la boîte de message (sinon les choses pourraient être bloquées).

Avec une boîte de dialogue modale normale, ce n'est pas un problème parce que la fenêtre parent est généralement désactivée pour la durée de la boîte de dialogue.

Le code qui lance la boîte de dialogue d'assertion n'a pas réussi à comprendre a dû la fenêtre parent, et donc il n'a pas été désactivé. Cela peut se produire si votre fenêtre principale n'est pas la fenêtre active au moment de l'affirmation. D'autres choses peuvent mal tourner aussi bien.

Vous pouvez modifier les rapports de bibliothèque d'exécution C de Visual Studio les échecs d'assertion avec _CrtSetReportMode . Vous pouvez le faire arrêter dans le débogueur et / ou connectez-vous à la fenêtre de sortie au lieu d'essayer de montrer la boîte de dialogue.

Autres conseils

Dialogs (même un messagebox) doivent pomper la file d'attente de messages, même si elles sont modales. Sinon, comment pourraient-ils savoir que vous avez cliqué sur le bouton « OK »?

Si vous devez arrêter tout quand un assert déclenche il est généralement pas trop difficile d'écrire votre propre implémentation de assert() (ou ASSERT() ou autre) qui brisera dans le débogueur au lieu d'afficher une boîte de message qui vous demande si vous voulez percer dans le débogueur (peut-être que si elle détermine que le débogueur est attaché).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top