Windows -Nachrichten, die während des Dialogfelds zur Annahme des Dialogfelds angezeigt werden, werden angezeigt?

StackOverflow https://stackoverflow.com/questions/1454058

  •  12-09-2019
  •  | 
  •  

Frage

Ich habe eine MFC -Anwendung, die eine Reihe verschiedener Arbeiterfäden hervorbringt und mit VS2003 zusammengestellt wird.

Wenn ich ctreectrl :: getItemState () aufruft, bekomme ich gelegentlich ein Dialog -Dialog mit Debug -Assertion. Ich gehe davon aus, dass dies daran liegt, dass ich an einem ungültigen Artikel übergeben habe, aber dies ist nicht mein unmittelbares Anliegen.

Mein Anliegen ist: Aus meinen Protokollen sieht es so aus, als würde der MFC -Thread weiterhin eine Reihe von Windows -Nachrichten bedienen, während das Dialogfeld "Assert" angezeigt wird. Ich dachte, der asserdische Dialog sei modal, also fragte ich mich, ob dies überhaupt möglich war.

War es hilfreich?

Lösung

Das Nachrichtenfeld, das den Behauptungsfehler anzeigt, hat eine Nachrichtpumpe für eigene Zwecke. Aber es wird alle einkünftigen Nachrichten entsenden, nicht nur die für das Nachrichtenfeld (ansonsten könnten die Dinge blockiert werden).

Bei einem normalen modalen Dialog ist dies kein Problem, da das übergeordnete Fenster für die Dauer des Dialogs normalerweise deaktiviert ist.

Der Code, der das Dialogfeld "Assertion" gestartet hat, muss das übergeordnete Fenster nicht herausgefunden haben, und daher war es nicht deaktiviert. Dies kann passieren, wenn Ihr Hauptfenster zum Zeitpunkt der Behauptung nicht das aktive Fenster ist. Andere Dinge können auch schief gehen.

Sie können ändern, wie die C-Laufzeitbibliothek von Visual Studios Behauptungen mit Behauptungen berichtet _CrtsetReportMode. Sie können es im Debugger stoppen und/oder sich im Ausgabefenster anmelden, anstatt zu versuchen, den Dialog zu zeigen.

Andere Tipps

Dialoge (sogar eine MessageBox) müssen die Meldungswarteschlange pumpen, auch wenn sie modal sind. Wie würden sie wissen, dass Sie auf die Schaltfläche "OK" geklickt haben?

Wenn Sie alles stoppen müssen, wenn ein Behauptung ausgelöst wird, ist es normalerweise nicht allzu schwierig, Ihre eigene Implementierung von zu schreiben assert() (oder ASSERT() oder was auch immer), das in den Debugger einteilt, anstatt eine MessageBox anzuzeigen, die fragt, ob Sie in den Debugger einbrechen möchten (möglicherweise nur, wenn er feststellt, dass der Debugger beigefügt ist).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top