アサートダイアログながら、サービスのWindowsメッセージが表示されていますか?
-
12-09-2019 - |
質問
私は別のワーカースレッドの数を生成しますし、VS2003でコンパイルされたMFCアプリケーションを持っています。
CTreeCtrlのを呼び出すときに:: GetItemState()私は時折、デバッグアサーションダイアログポップアップを取得しています。私は無効な項目へのハンドルに渡されましたが、これは私の当面の関心事ではないためであると仮定しています。
私の懸念がある:MFCスレッドがアサートダイアログが表示されている間、ウィンドウメッセージの数にサービスを提供し続けているかのように私のログから、それが見えます。私はこれも可能であった場合ので、私は思っていたアサートダイアログがモーダルだと思った?
解決
アサーションの失敗を示してメッセージボックスには、独自の目的のためにメッセージポンプを持っています。しかし、それだけではなく、それらのメッセージボックス(そうでないものがブロックされ得る可能性)のために、入ってくるすべてのメッセージをディスパッチします。
親ウィンドウは、通常、ダイアログの期間無効になっているため、通常のモーダルダイアログでは、これは問題ではありません。
アサーションダイアログを起動するコードは、親ウィンドウを把握することができなかったに違いないので、それが無効になっていませんでした。あなたのメインウィンドウがアサーションの時にアクティブウィンドウでない場合に発生することがあります。他のものも同様に間違って行くことができます。
あなたはでどのようにのVisual StudioのCランタイムライブラリレポートアサーションの失敗を変更することができます_CrtSetReportModeする。あなたはそれがデバッガで停止および/またはその代わりにダイアログを表示しようとしているの出力ウィンドウにログインすることができます。
他のヒント
ダイアログ(でもメッセージボックス)は、彼らがモーダル方にも、メッセージキューをポンプする必要があります。それ以外の場合はどのように彼らはあなたが「OK」ボタンをクリックした知っているだろう?
あなたはアサートが、それはあなたがに侵入するかどうかを確認するメッセージボックスを表示する代わりに、デバッガに壊れますassert()
(またはASSERT()
または何でも)の独自の実装を記述するために、通常はあまりにも難しいことではありませんトリガしたときに、すべてを停止する必要がある場合デバッガ(おそらく唯一のことは、デバッガが接続されていると判断した場合)。