Domanda

Ho un'applicazione MFC che genera una serie di diversi thread di lavoro ed è compilato con VS2003.

Quando si chiama CTreeCtrl :: GetItemState () Sto volte ottenendo una finestra pop-up di debug asserzione. Sto assumendo che questo è perché ho passato in un manico a un elemento valido, ma questo non è il mio preoccupazione immediata.

La mia preoccupazione è: Da mio log, sembra come se il filo MFC continua a servizio di un certo numero di messaggi di Windows mentre è visualizzata la finestra di dialogo assert. Ho pensato che il dialogo assert era modale quindi mi chiedevo se questo fosse possibile?

È stato utile?

Soluzione

La finestra di messaggio che mostra il fallimento asserzione ha una pompa messaggio per i propri scopi. Ma che spediremo tutti i messaggi che arrivano, non solo quelli per la finestra di messaggio (altrimenti le cose potrebbero ottenere bloccato).

Con una finestra di dialogo modale normale, questo non è un problema perché la finestra padre è in genere disattivato per tutta la durata della finestra di dialogo.

Il codice che lancia la finestra di dialogo asserzione deve aver non è riuscito a capire la finestra padre, e quindi non è stato disattivato. Questo può accadere se la finestra principale non è la finestra attiva al momento della asserzione. Altre cose possono andare male pure.

È possibile modificare la modalità di Visual Studio di runtime C fallimenti rapporti biblioteca asserzione con _CrtSetReportMode . È possibile farlo smettere nel debugger e / o accedere alla finestra di output invece di cercare di mostrare la finestra di dialogo.

Altri suggerimenti

Dialogs (anche un MessageBox) hanno bisogno di pompare la coda di messaggi, anche se sono modale. Altrimenti come avrebbero sapere si è fatto clic sul pulsante "OK"?

Se avete bisogno di fermare tutto quando un'asserzione innesca di solito non è troppo difficile da scrivere una propria implementazione di assert() (o ASSERT() o altro) che passare al debugger invece di visualizzare un messagebox che chiede se si desidera entrare nel il debugger (forse solo se determina che il debugger è collegato).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top