2012-05-04 10 views
1

こんにちは私はいくつかのチェックボックスをプログラムで特定のシーケンスでチェックしたりチェックを外したりするようにプログラムしようとしています。私はそれが馬鹿に聞こえることを知っていますが、これは私がすでにチェックイベントをコード化しているいくつかのLEDコントロールに対応しています。チェックボックスのチェックシーケンスを作成する

このシーケンスを開始するにはチェックボックスをオンにし、停止するにはこのチェックボックスをオフにします。現在、私のD2チェックボックスのチェックとアンチェックはうまくいきますが、do whileループでフォームがフリーズしてしまい、実際にサイクルボックスのチェックを外すことはできません。おそらくThread.Sleepを使ってはいけません。アドバイスをいただければ幸いです。 UIが凍結されている理由ですがチェックイベント内で直接呼び出された場合

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

      } while (cycleCheckBox.Checked); 
     } 
+0

ループを終了するには別の方法を使用してください。ループにカウンタを入れて10などの後に終了してください。私はこれがUIスレッドで実行されていると考えているので、sleepを呼び出すとUIがスリープしてループを終了するのが非常に難しくなります。ループ内のロジックを別のスレッドに移動する必要があります。タイマーのための – evanmcdonnal

答えて

1

Thread.Sleep方法は、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; 
} 
+0

よ!私は、これがより良い選択肢に終わるつもりだったのです。ありがとう。 – ikathegreat

0

私はこれがあなたのために働く場合は知っているが、私はどうなることは1000msでタイマーコントロールのドラッグであり、図にメソッドを使用していませんチェックポイントは現在、特定のポイントで0にループし、各ティックでインクリメントされる整数を使用してチェックする必要があります。

関連する問題