0

アプリケーションがクラッシュした場合、クラッシュをインターセプトします(関数SetUnhandledExceptionFilterを使用)。クラッシュハンドラーで、ミニダンプファイルを作成し、アプリケーションがクラッシュしたことをユーザーに通知します。この通知は、フラグMB_TASKMODALのMessageBoxを介して行われるため、アプリケーションの残りの部分はブロックされます。

残念ながら、それは再描画メッセージとタイマーメッセージの処理をブロックしません。特にタイマーメッセージは、あらゆる種類の中間アクション(アプリケーションにロードされているプラ​​グインによって異なります)を実行したり、バックアップファイルに保存したりする可能性があるため、非常に煩わしいものです。

Windowsが再ペイントメッセージとタイマーメッセージを送信しないようにする簡単な方法はありますか(「クラッシュしました」ポップアップを表示している間)?

別の方法は、クラッシュハンドラーで設定され、ロジックを実行するアプリケーションのすべての場所でチェックされるグローバル変数を使用することですが、これは私にはかなり「汚い」柔軟性のないソリューションのようです。もっと簡単な方法はありませんか?(そして、メッセージボックスのメッセージループがメッセージボックスメッセージのみを処理し、他のウィンドウのメッセージを処理しないことを確認するだけです)。

サンクスパトリック

4

2 に答える 2

1
  • Windowsが再描画およびタイマーメッセージを送信するのを防ぐことはできません。結局のところ、メッセージボックス自体も再描画する必要があります。

  • モーダルメッセージボックスは、表示されたUIスレッドの実行をブロックします。これにより、生成したバックグラウンドスレッド、またはスレッドプールでスケジュールした作業項目が実行されたままになります。

  • ミニダンプを取得し、アプリがクラッシュしたことがわかります。プロセスを維持し、その中からメッセージボックスを表示したいのはなぜですか?あなたは明らかにアプリが回復できることを期待していないので、その時点で合理的なことは、ユーザーにメッセージを表示してクラッシュするアプリケーションを終了する小さなヘルパープロセスを開始することです。

于 2009-12-17T09:05:28.620 に答える
0

クラッシュダイアログを安全に表示する方法は1つだけです。それは、そのために特別に作成された別のスレッドです。クラッシュしたスレッドでダイアログを作成すると、そのスレッドのウィンドウ宛てに投稿されたメッセージと送信されたメッセージの両方が送信されて送信されるため、(お気づきのとおり)あらゆる種類の副作用が発生します。

問題は、クラッシュハンドラー内からダイアログを作成するのは安全ですか?問題になる可能性のあるいくつかのシナリオを考えることができます-特にグローバルローダーロックが関係している場合(つまり、dllがロードされているためにオブジェクトの初期化のどこかでクラッシュが発生します)。

したがって、アプリの起動時にスレッドを作成し、スタンバイ状態にすることをお勧めします。

于 2009-12-17T09:12:10.293 に答える