1

こんにちは、いくつかのチェックボックスをプログラムして、特定のシーケンスでチェックおよびチェック解除するようにプログラムしようとしています。ばかげているように聞こえるかもしれませんが、これは既にチェック イベントをコーディングしたいくつかの LED コントロールに対応しています。

チェックボックスをオンにしてこのシーケンスを開始し、チェックを外して停止したいと思います。現在、D2 チェックボックスのチェックとチェック解除は正常に行われますが、do whileループによってフォームがフリーズするため、サイクル ボックスを実際にチェック解除することはできません。私はおそらくどちらも使用すべきではありませんThread.Sleep。アドバイスをいただければ幸いです。

private void cycleCheckBox_CheckedChanged(object sender, EventArgs e)
        {
            do
            {
                D2.Checked = true;
                Thread.Sleep(1000);
                D2.Checked = false;
                Thread.Sleep(1000);    

            } while (cycleCheckBox.Checked);
        }
4

2 に答える 2

1

このThread.Sleepメソッドは、checkedイベントで直接呼び出された場合、UIスレッドで実行されます。これが、UIがフリーズする理由です。作業をSystem.Windows.Forms.Timerにプッシュします(これはWinFormsアプリであると想定しています)。

ユーザー定義の間隔でイベントを発生させるタイマーを実装します。このタイマーは、Windowsフォームアプリケーションでの使用に最適化されており、ウィンドウで使用する必要があります。

あなたの質問に基づく例:

Timer _timer;

private void cycleCheckBox_CheckedChanged(object sender, EventArgs e)
{
    if(_timer == null )
    {
        _timer = new Timer();
        _timer.Interval = 1000; // 1 second
        _timer.Tick += DoTimerWork;
    }

    if(cycleCheckBox.Checked)
    {
        _timer.Start();
    }
    else
    {
        _timer.Stop();
    }
}

private void DoTimerWork(object obj, EventArgs args) 
{
    D2.Checked = !D2.Checked;
}
于 2012-05-04T03:18:10.167 に答える
0

これがうまくいくかどうかはわかりませんが、1000ミリ秒でタイマーコントロールをドラッグし、特定の時点で0にループする整数を使用して、現在どのチェックボックスをチェックする必要があるかを特定する方法を使用しますティックごとにインクリメントされます。

于 2012-05-04T03:25:34.147 に答える