私は CompSci の学生で、C# の初心者で、クラスで「Josephus Problem」プログラムを作成していました。Application.Exit() を呼び出していつでも終了できる終了ボタンを作成しましたが、C# がまだ描画中にボタンが押されると、Graphics オブジェクトの ObjectDisposedException がスローされます。これを防ぐ方法はありますか?ブール値をキャッチまたは変更して、描画プロセスを終了する前に停止するようにしようと考えていましたが、別の解決策があるかどうか知りたいです。{}
2 に答える
フォームを整然と閉じるには、ボタンを含むフォームの Close() メソッドを呼び出す必要があります。メイン フォームを閉じると、いずれにしてもアプリケーションが終了します。
これが起こることは不可能であるべきです。ボタンがウィンドウと同じスレッドで作成された場合、それらはメッセージ ポンプを共有し、終了ボタンを処理するためにペイント ハンドラーを中断することはできません。ボタンがクリックされたというメッセージは、Paint ハンドラーが戻るまでスレッドのメッセージ キューに入れられます。
一般に、ペイントを Paint ハンドラーに任せる (または OnPaint をオーバーライドする) 必要があり、画面を更新する必要があるその他の場所では、コントロールの Invalidate メソッドを呼び出します。これにより、ある領域を再描画する必要があることが Windows に通知され、他のすべてのメッセージが処理されると、WM_PAINT
最終的に OnPaint を呼び出すメッセージが生成され、OnPaint が Paint イベントを発生させます。
アニメーション化する場合はSystem.Windows.Forms.Timer
、スレッドを使用するのではなく、 を使用して各フレームをトリガーします。System.Threading.Timer
コールバックはスレッドプールで実行されるため、UI を操作するには常に間違ったスレッドになります。