2012-05-04 4 views
1

Здравствуйте, я пытаюсь запрограммировать некоторые флажки, чтобы они были проверены и неконтролируемы в определенной последовательности программно. Я знаю, что это звучит глупо, но это соответствует некоторым элементам управления светодиодами, которые я уже закодировал для событий проверки.создать контрольную последовательность checkbox

Я хочу установить флажок, чтобы начать эту последовательность, и снимите флажок, чтобы остановить его. В настоящее время проверка и снятие флажка 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); 
     } 
+0

Попробуйте использовать другую технику для выхода из цикла, поставьте счетчик в цикле и выйдите после 10 или что-то в этом роде. Я считаю, что это выполняется в потоке пользовательского интерфейса, поэтому более вероятно, когда вы вызовете спящий режим, пользовательский интерфейс будет спать, из-за чего очень сложно выйти из цикла. Возможно, вам придется переместить логику в цикле в другой поток. – evanmcdonnal

ответ

1

Метод Thread.Sleep будет работать в потоке пользовательского интерфейса, если вызывается непосредственно в зарегистрированном случае именно поэтому пользовательский интерфейс замерзает. Нажмите на работу в System.Windows.Forms.Timer (предположения это приложение WinForms):

Реализует таймер, который вызывает событие в определенные пользователем интервалы времени. Этот таймер оптимизирован для использования в приложениях Windows Forms и должен использовать в окне.

Пример основан на ваш вопрос:

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

yay для таймеров! у меня была догадка, что это закончится лучшим вариантом. Благодарю. – ikathegreat

0

Я не знаю, если это будет работать для вас, но то, что я хотел бы сделать, это перетащить в элементе управления Timer на 1000 мс и использовать метод фигуры вне которого флажок должен быть проверен с помощью целого числа, которое в определенной точке цикла равно 0 и получает приращение при каждом тике.

Смежные вопросы