2

さまざまなワーカースレッドを生成し、VS2003でコンパイルされたMFCアプリケーションがあります。

CTreeCtrl :: GetItemState()を呼び出すと、デバッグアサーションダイアログポップアップが表示されることがあります。これは、無効なアイテムへのハンドルを渡したためだと思いますが、これは私の当面の懸念事項ではありません。

私の懸念は次のとおりです。ログから、アサーションダイアログが表示されている間、MFCスレッドが多数のWindowsメッセージを処理し続けているように見えます。アサーションダイアログはモーダルだと思ったので、これが可能かどうか疑問に思いました。

4

2 に答える 2

4

アサーションの失敗を示すメッセージボックスには、独自の目的のためのメッセージポンプがあります。ただし、メッセージボックスのメッセージだけでなく、受信したすべてのメッセージをディスパッチします(そうしないと、ブロックされる可能性があります)。

通常のモーダルダイアログでは、親ウィンドウは通常、ダイアログの期間中は無効になっているため、これは問題にはなりません。

アサーションダイアログを起動するコードは、親ウィンドウを理解できなかったため、無効にされていませんでした。これは、アサーションの時点でメインウィンドウがアクティブウィンドウでない場合に発生する可能性があります。他のこともうまくいかない可能性があります。

Visual StudioのCランタイムライブラリが_CrtSetReportModeを使用して、アサーションの失敗を報告する方法を変更できます。ダイアログを表示しようとする代わりに、デバッガーで停止したり、出力ウィンドウにログを記録したりできます。

于 2009-09-22T19:48:56.470 に答える
2

ダイアログ(メッセージボックスでさえ)は、モーダルであっても、メッセージキューをポンプする必要があります。そうでなければ、彼らはあなたが「OK」ボタンをクリックしたことをどうやって知るのでしょうか?

アサートがトリガーされたときにすべてを停止する必要がある場合は、通常、デバッガーに侵入するかどうかを尋ねるメッセージボックスを表示する代わりに、デバッガーに侵入する独自の実装assert()(またはその他)を作成することはそれほど難しくありません(おそらくASSERT()デバッガーが接続されていると判断された場合)。

于 2009-09-21T15:46:05.790 に答える