次のようなフォームのコンストラクターにメインループを追加する Windows フォーム アプリケーションがあります。
Application.Idle += new EventHandler(Update);
それは正常に動作します - ただし、アプリケーション ウィンドウを最小化すると、更新機能が呼び出されません。ウィンドウが最小化されているときに更新関数を呼び出すにはどうすればよいですか?
System.Threading.Timerから呼び出すことができます。最小化されたときにタイマーを開始するか、タイマーを実行させて(低頻度)、更新を呼び出す前に最小化をテストします。
これを行う最も賢明な方法はUpdate
、別のスレッドからコードを実行することです。アイドルイベントまたはタイマーソリューションは両方とも問題が発生します。
ただし、スレッドを使用する場合は、UIコントロールに触れるときに注意する必要があります。簡単なアプローチはBackgroundWorkerです。スレッドセーフで実行されるCompletedイベントとProgressイベントがあります。
Henk が提案するようにタイマーを使用できますが、メソッドがまだ処理中であることを知らせるフラグを追加するだけです。
したがって、たとえば 50 ミリ秒の遅延時間を設定し、次のようにイベント ハンドラーをコーディングします。
private void timer1_Tick(object sender, EventArgs e)
{
if ((this.WindowState == FormWindowState.Minimized) && !_isProcessing)
{
_isProcessing = true;
// Do stuff
_isProcessing = false;
}
}
where_isProcessing
は、フォームのプライベート ブール変数です。
操作にかかる時間がそれぞれ 50 ミリ秒未満であると予想される場合は、何らかの方法で操作を集約します (おそらくキューが適切でしょう)。
確実にこれを試す必要がありますが、最初の推測は、フォームのResizeイベントを接続し、ハンドラーで、フォームが最小化されているかどうかを確認することです...