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方法将在 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 回答