таймер c # идет слишком быстро, если установлен - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь реализовать простой обратный отсчет, используя таймер (используя код https://www.geoffstratton.com/cnet-countdown-timer). это работает, если я запускаю таймер один раз, но если я остановлю таймер или таймер перейдет к 00:00, в следующий раз, когда я его запусту, он пойдет в 2 раза быстрее. если я остановлю его и начну снова, он пойдет в 3 раза быстрее.

(моё объяснение может быть неясным, я сделал gif, который демонстрирует проблему) https://media.giphy.com/media/fQr7sX6LNRECvQpCYP/giphy.gif

Я очень новичок в c #, я обычно все выясняю, но не могу понять, что здесь происходит. Я включил код таймера. если кто-то может помочь мне с этим, это было бы здорово! Спасибо !!!

        private void btnStartTimer_Click(object sender, EventArgs e)
    {
        if (txtTimer.Text == "00:00")
        {
            MessageBox.Show("Please enter the time to start!", "Enter the Time", MessageBoxButtons.OK);
        }
        else
        {
            string[] totalSeconds = txtTimer.Text.Split(':');
            int minutes = Convert.ToInt32(totalSeconds[0]);
            int seconds = Convert.ToInt32(totalSeconds[1]);
            timeLeft = (minutes * 60) + seconds;
            btnStartTimer.Enabled = false;
            btnCleartimer.Enabled = false;
            txtTimer.ReadOnly = true;
            timer1.Tick += new EventHandler(timer1_Tick);
            timer1.Start();
        }
    }
    private void btnStopTimer_Click(object sender, EventArgs e)
    {
        timer1.Stop();
        timeLeft = 0;
        btnStartTimer.Enabled = true;
        btnCleartimer.Enabled = true;
        txtTimer.ReadOnly = false;
    }
    private void btnCleartimer_Click(object sender, EventArgs e)
    {
        txtTimer.Text = "00:00";
    }
    private void timer1_Tick(object sender, EventArgs e)
    {
        if (timeLeft > 0)
        {
            timeLeft = timeLeft - 1;
            // Display time remaining as mm:ss
            var timespan = TimeSpan.FromSeconds(timeLeft);
            txtTimer.Text = timespan.ToString(@"mm\:ss");
            // Alternate method
            //int secondsLeft = timeLeft % 60;
            //int minutesLeft = timeLeft / 60;
        }
        else
        {
            timer1.Stop();
            SystemSounds.Exclamation.Play();
            MessageBox.Show("Time's up!", "Time has elapsed", MessageBoxButtons.OK);
        }
    }

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вы добавляете событие в Count каждый раз, когда запускаете таймер. В результате при первом вызове происходит только одно событие, во второй раз - два события и так далее. В результате вы сначала спускаетесь на одну секунду, потом на две, .... Я бы порекомендовал создать таймер отдельно и просто вызвать Start и Stop. Alternativ, пользователь Дмитрий Королев ответил хорошим подходом, если вы не хотите создавать таймер где-то еще

timer1.Tick -= timer1_Tick;
0 голосов
/ 06 сентября 2018

Вам необходимо отписаться от события в вашем методе btnStopTimer_Click:

timer1.Tick -= timer1_Tick;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...