0

DLLを介して参照される2つの子フォーム(参照に追加されたスタンドアロンプ​​ロジェクト)を含むMDIアプリケーションをC#で作成しています。1つの子フォーム(form1と呼びます)は、タイマーを使用してグラフィックオブジェクトに基づいてアニメーションを実行しています。このプロジェクト(子フォーム1)は、他の子フォーム(フォーム2と呼びます)がロードされるまで正常に機能します。最初のフォーム(form1)のアニメーションは停止しますが、この2番目の子フォーム(form2)を閉じると、アニメーションは問題なく続行されます。

私はこのコードをform2で使用します:

private void FlyingBeeForm_Paint(object sender, PaintEventArgs e) {
    Graphics g = e.Graphics; 
    DrawImages(g); 
    System.Threading.Thread.Sleep(50); 
    this.Invalidate(); 
}
4

1 に答える 1

1

タイマーは、間隔が経過したときにWindowsによって配信される通知によって継続されます。ただし、これは非常に優先度の低い通知であり、他の作業を行う必要がない場合にのみ通知されます。

これで、Paintイベントハンドラーに問題が発生するはずです。一つには、あなたは絶えず眠ることによってどんな仕事も成し遂げられないようにします。次に、Invalidate()を呼び出して、実行する必要のある作業が常にあることを確認します。そのため、Windowsは新しいペイントイベントを生成し、タイマーイベントを配信できる状態に移行することはありません。

SleepandInvalidate呼び出しを削除する必要があります。代わりに50ミリ秒のタイマーを使用してください。TickイベントハンドラーでInvalidate()を呼び出すだけです。

于 2012-05-08T15:10:58.480 に答える