Таймер в C # действует очень странно - PullRequest
0 голосов
/ 25 января 2019

Я не уверен, что не так с этим кодом.Интервал timer1 установлен на 1000.

namespace timerbug
{
    public partial class Form1 : Form
    {
        int value;

        public Form1()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            do
            {
                value++;
                label1.Text = value.ToString();
            }
            while (value <= 5);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            value = 0;
            timer1.Start();
        }
    }
}

Я думал, что на этикетке будет отображаться от 1 до 5, а затем остановится.Отсчет даже не показывается до 6 и продолжает увеличиваться до тех пор, пока я не остановлю программу.Может кто-нибудь объяснить, почему цифры от 1 до 5 не отображаются, а затем почему они не заканчиваются на 5?Спасибо.

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Изменение кода timer1_tick на это работало нормально, спасибо за помощь.Мне нужно многому научиться.

        value++;

        if (value >= 5)
        {
            timer1.Stop();
        }

            label1.Text = value.ToString();
            label1.Invalidate();
            label1.Update();

        }
0 голосов
/ 25 января 2019

Как и другие люди правильно указали в комментариях, он останавливается на 6 вместо 5, поскольку 6 - это первое значение, для которого value <= 5 оценивается как ложное (вы используете цикл do-while,что означает, что условие оценивается после выполнения тела.).Чтобы остановиться на 5, вы можете либо использовать обычный цикл while, либо изменить условие на value < 5 или value <= 4.

Более того, 6 итераций цикла в C # происходят в несколькихмикросекунд.Вы не могли видеть цифры, отображаемые на этикетке, даже если все остальное было сделано правильно, просто потому, что это произошло бы слишком быстро.Чтобы увидеть, что что-то происходит, вам нужно ввести некоторую задержку (Thread.Sleep()), и в конце каждой итерации вам нужно будет вызвать Application.DoEvents()чтобы перекрасить форму.

В качестве альтернативы, вы можете использовать галочки Timer, что было бы предпочтительнее в большинстве случаев.Вы можете сделать это, например, так.

namespace timerbug
{
    public partial class Form1 : Form
    {
        int value;

        public Form1()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (value < 5)
            {
                value++;
                label1.Text = value.ToString();
            }
            else
            {
                timer1.Stop();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            value = 0;
            timer1.Start();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...