2009-05-16 8 views
3

私はC#でSierpinskiの三角形をゆっくり描くスクリーンセーバーを書いています。私は再帰関数内でThread.Sleepを使用して描画を減速させます。しかし、マウスの移動やキーの押下などでユーザーが終了できるようにする方法が必要です。フォームのPaintイベントハンドラ内から描画関数が呼び出されるので、マウスイベントとキーボードイベントは、全体の三角形がそれはかなりの時間がかかることがあります。どのように再帰関数が実行されている間、イベントを処理するようにフォームを強制することができますか? (ペイントイベントなどを呼び出すイベント処理を強制する描画関数を呼び出すペイントイベントを呼び出すことによる無限ループを回避する方法)再帰関数の内部でイベント処理を強制する方法はありますか?

答えて

4

あなたはです。を使用してください。Application.DoEvents - しかし、私はそれを助言するとは確信していません。再突入問題、特にPaintイベントで簡単に終わることができます。

Paintイベントを処理している場合は、本当にUIスレッド上で実際に作業が必要なように聞こえるのですか?

Paintイベントハンドラを使用する代わりに、Bitmapを作成して描画する方法もあります。これは、バックグラウンドスレッドで行うことができます。定期的に新しいイメージを作成し、これまでに描画したイメージをコピーし、次のレイヤーを描画してから、UIスレッドをマーシャリングしてUIでイメージを使用します。これにより、メインのUIスレッドはイベント処理のために自由になります。 Paintイベントを処理する必要はありません。「これまでのイメージ」を表示するために使用するのはPictureBoxです。メモリの問題を避けるために、古いビットマップの処理が終わったらそれを廃棄することを忘れないでください。

+0

ワーカーアプローチの場合+1。私はDoEventsを使用しないようにJonのアドバイスを2回目 –

2

いつでも計算/描画できるバックバッファービットマップを使用できますPaintイベントに表示するだけです。計算は別のスレッドで行うことができます。

関連する問題