2

我想停止计时器,但在滴答声的中间,在滴答声完成之前。但是当我使用一个按钮来停止计时器时,它只会在滴答声完成他的所有功能后才会停止。

我正在使用 4 个单选按钮和一个不断更改所选单选按钮的计时器。当我按下停止按钮时,我的计时器停止,我需要知道选择了哪个单选按钮,但计时器只是在滴答完成后停止,所以选定的单选按钮会改变。

代码是:

namespace teste_bola
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Int32 x = 1000;

        private void ini_Click(object sender, EventArgs e)
        {

            timer1.Enabled = true;
        }

        private void par_Click(object sender, EventArgs e)
        {
            timer1.Enabled = false;
        }
        private void t_Click(object sender, EventArgs e)
        {
            Int32 Intervalo = Convert.ToInt32(tb.Text);
            x = Intervalo;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            r3.Select();
            System.Threading.Thread.Sleep(x);
            r2.Select();
            System.Threading.Thread.Sleep(x);
            r1.Select();
            System.Threading.Thread.Sleep(x);
            r2.Select();
            System.Threading.Thread.Sleep(x);
            r3.Select();
            System.Threading.Thread.Sleep(x);
            r4.Select();
            System.Threading.Thread.Sleep(x);
        }

    }
}
4

4 回答 4

1

您可以引入一个标志bool shouldStop,在单击按钮时设置它,并从Tick处理程序中检查它。如果是真的,那么就退出该方法。

于 2013-04-01T13:51:29.747 回答
1

我没有遵循您在代码中尝试完成的操作,但在我看来,您没有正确使用计时器。

您应该执行以下操作:

在每个计时器上。勾选更改选定的单选框。

你实际上在做的是:

在每个计时器上。勾选所有单选框的更改,更改之间有时间间隔。

这意味着在第一个计时器超时时执行滴答代码。在第二个计时器超时时,第一个滴答作业尚未完成。

至少可以说,这将导致不稳定的行为。

我的建议。将单选按钮添加到 ArrayList。然后 cicle 在 Timer 刻度上的每个 ArrayList 项之间进行选择。

于 2013-04-01T14:02:17.083 回答
0

尝试以下

private void timer1_Tick(object sender, EventArgs e)
    {
        r3.Select();
        System.Threading.Thread.Sleep(x);
        if(timer1.Enabled == false) return;
            r2.Select();
            System.Threading.Thread.Sleep(x);
            if(timer1.Enabled == false) return;
            r1.Select();
            System.Threading.Thread.Sleep(x);
            if(timer1.Enabled == false) return;
            r2.Select();
            System.Threading.Thread.Sleep(x);
            if(timer1.Enabled == false) return;
            r3.Select();
            System.Threading.Thread.Sleep(x);
            if(timer1.Enabled == false) return;
            r4.Select();
            System.Threading.Thread.Sleep(x);
            }
于 2013-04-01T13:58:05.083 回答
0

您可能会遇到这种行为,因为您的线程在执行 timer1_Tick 期间处于休眠状态,因此可能存在事件队列。

正如 alex 建议的那样,您可以添加一个标志,但您应该在每次睡眠后检查它,或者更好的是,将您的动画放在不同的线程中。

于 2013-04-01T13:58:58.457 回答