1

そのコントロールの Load イベントの下にアイドル イベントを登録したユーザー コントロールがあります。

Control_Load(object sender, System.EventArgs e)
{
    Application.Idle += new EventHandler(Application_Idle);
}

アプリケーションが処理を終了してアイドル状態に達したときにこれがトリガーされることはわかっています。これの意味は?

たとえば、このコードを含むフォームを作成しました

int counter = 0;
private void Form1_Idle(object sender, System.EventArgs e)
{
    counter++;
    label1.Text = counter.ToString();
}

private void Form1_Load(object sender, System.EventArgs e)
{
    Application.Idle +=new EventHandler(Form1_Idle);
}

次に、特定の操作を行うフォームでいくつかのブテンを作成します。アイドル状態ではないため、作成したボタンを介して操作を行っているときに、理解されているラベルカウンターが増加することはありませんが、今起こっていることは、いくつかの操作が行われていることです。ボタンをクリックすると、フォームのタイトルバーを押してフォームを移動した場合を除いて、ラベルカウンターが増加します。

もう1つ、これがメインアプリケーションウィンドウであっても、ウィンドウを閉じるときにこれらのイベントハンドラーをデタッチする必要があります。もしそうなら、disposeメソッドでそれで十分ですか?

protected override void Dispose(bool disposing)

更新 キーボードで「LARSEN」と言うテキストを押している場合、アルファベット「L」と「A」を押す間にアイドルイベントが発生しますか?

4

2 に答える 2

3

Idle イベントは、1 回だけでなく、アプリケーションに空き時間ができるたびに呼び出されます。一度だけ呼び出したい場合は、完了後にイベント ハンドラーを次のようにデタッチします。

Application.Idle -= Application_Idle;

これは、アプリケーションをシャットダウンする前にイベントから切り離す方法でもあります。

于 2012-05-16T05:29:02.457 に答える
2

すべてのメッセージを処理し、メッセージが残っていない場合に毎回トリガーされます。破棄に関しては、MSDN によると「これは静的イベントであるため、アプリケーションを破棄するときにイベント ハンドラーをデタッチする必要があります。そうしないと、メモリ リークが発生します。」-フォームの破棄時(または、ハンドラーがフォームと関係がある場合はおそらくフォームのクローズ時)にデタッチするだけで十分だと思います。

upd:メッセージ ループは、次のように Program.cs で開始されます。

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new frmMain());
    }

マウスの移動、キーの押下など、すべてのメッセージを処理します。おそらく本などのどこかで詳しく読む必要がありますが、はい、最初のキープレスが処理された後、2番目のキーを押すずっと前に「アイドル」状態があります。

upd2:「実際のアイドル状態」を検出したい場合は、このハンドラーである種のタイマーを開始 (および再開始) したい場合があり、タイマーが切れたときに、正確な望ましい条件に応じて、CPU 負荷などを確認します。

于 2012-05-16T04:24:14.613 に答える