db211086004 Ответов: 2

Как ввести время в таймер обратного отсчета даты и времени


Я сделал таймер обратного отсчета, используя компонент timer для обновления метки с оставшимся временем. Проблема в том, что даже если интервал установлен в 1, метка не обновляется каждую миллисекунду. Я читал на разных сайтах, что это потому, что это не среда реального времени.

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

Видя, что метод DateTime обновляет метку каждую миллисекунду, мне было интересно, можно ли сделать таймер обратного отсчета с помощью метода DateTime, который отсчитывает время от А до заданного количества времени (часы, минуты, секунды, миллисекунды)?

Что я уже пробовал:

Я искал об этом и читал несколько тем на веб-сайтах, в том числе несколько на этом, искал Microsoft Docs и MSDN, но я просто не могу заставить его работать.

2 Ответов

Рейтинг:
2

RickZeeland

Смотрите статью CodeProject здесь: Микросекундный и миллисекундный таймер C# [^]

И пример обратного отсчета здесь: Таймер обратного отсчета и секундомер - Иван Попов[^]

Обратите внимание, что Секундомер класс зависит от системного оборудования и операционной системы: Секундомер.Поле IsHighResolution (Система.Диагностика) | Microsoft Docs[^]


db211086004

Это действительно отлично работает, но можно ли использовать его для обратного отсчета от определенного заданного количества времени.

Как я уже сказал, метод, который я использую при вычислении с DateTime, работает нормально, но я не могу правильно установить время.

Рейтинг:
11

OriginalGriff

Таймер не "срабатывает" с точными интервалами, они обрабатываются через обычную систему сообщений Windows, которая никоим образом не является системой реального времени, формой или формой. Все, что вам гарантировано, - это то, что событие тика таймера не произойдет меньше, чем за этот интервал.

Таким образом, способ сделать обратный отсчет состоит в том, чтобы установить уровень класса DateTime на конечное время:

private DateTime endsAt;
...
   endsAt = DateTime.Now.AddMinutes(5);
Затем в обработчике тиков подсчитайте сколько осталось:
void countDown_Tick(object sender, EventArgs e)
    {
    int secondsRemaining = (int) (endsAt - DateTime.Now).TotalSeconds;
    myLabel.Text = secondsRemaining.ToString();
    }


db211086004

Но тогда почему это работает для второго метода? Тот, который использует вычисление даты и времени.

Кроме того, когда я использую ваш метод, я не могу установить правильное количество времени (часы, минуты, секунды, миллисекунды) и отформатировать его в строку. Он показывает все время в заданном количестве (секунды или миллисекунды).

OriginalGriff

:вздыхать:
Мой код был примером того, что вы можете сделать: если вы посмотрите на класс TimeSpan (который возвращает вычитание двух значений DateTime), он даст вам все необходимые биты.

Это работает, потому что не имеет значения, когда на самом деле происходит тик - метка обновляется с текущим оставшимся временем, даже если это не произошло в течение десяти минут!

db211086004

Я надеюсь, что не буду еще больше раздражать вас, задавая еще один последующий вопрос, но я прочитал статьи класса TimeSpan в Microsoft Docs и MSDN и попытался использовать и изменить предложенный вами код, но не могу заставить его работать. Моя метка не показывает обратного отсчета, она просто показывает количество времени, прошедшее с момента нажатия кнопки (даже после форматирования строки), а не исходное установленное время минус прошедшее время.

Я пытался создать 2 значения TimeSpan и вычесть их (я даже сложил их вместе, чтобы посмотреть, имеет ли это значение), я пытался сделать то же самое с 2 значениями DateTime, я пытался добавить время с помощью TimeSpan.Часы (и делать то же самое для минут, секунд и миллисекунд все в одной строке кода), я даже нашел пользовательский класс CountDownTimer и использовал и изменил его, но все они не работают.

Я либо получаю метку, которая просто показывает общее количество прошедшего времени, считая вверх (в зависимости от того, как я кодирую ее иногда с символом - перед ней) с помощью метода DateTime, либо метка не обновляется с правильным интервалом (при использовании обычного таймера).

OriginalGriff

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

db211086004

Это код для обычного таймера, который я нашел в учебнике:

 milliseconds--;

            if(milliseconds == 0)
            {
                if(seconds > 0 || minutes > 0 || hours > 0)
                {
                    seconds--;
                    milliseconds = 999;

                    if(seconds < 0)
                    {
                        if(minutes > 0)
                        {
                            minutes--;
                            seconds = 59;
                        }
                    }

                    if(minutes < 0)
                    {
                        if(hours > 0)
                        {
                            hours--;
                            minutes = 59;
                        }
                    }
                }
            }

            if(hours == 0 && minutes == 0 && seconds == 0 && milliseconds == 0)
            {
                timer1.Stop();
                MessageBox.Show("You have arrived.");
            }

            label_Timer.Text = string.Format("{0}:{1}:{2}:{3}", hours.ToString().PadLeft(2, '0'), minutes.ToString().PadLeft(2, '0'), seconds.ToString().PadLeft(2, '0'), milliseconds.ToString().PadLeft(2, '0'));

Это код для вычисления даты и времени:
 TimeSpan timeElapsed = DateTime.Now - startTime;

            // DOES THE SAME AS ABOVE BUT WITH A - IN FRONT OF IT
            //TimeSpan timeElapsed = startTime - DateTime.Now;

            label_DateTime.Text = timeElapsed.TotalSeconds.ToString("00:00:00.000");

Я экспериментировал с меткой DateTime, но никогда не получал реального обратного отсчета.

OriginalGriff

:вздыхать:
Вернитесь к моему первоначальному ответу и прочитайте то, что я сказал.
Если вычесть текущее время из времени начала, то, конечно, вы получите увеличивающееся (если отрицательное) значение!

Затем вернитесь и посмотрите, что я сказал в ответ на ваш первый комментарий. TotalSeconds-это всего лишь одно из значений, которые может предоставить TimeSpan ...

db211086004

Я просто хочу поблагодарить вас за ваше время и использовать обычный таймер обратного отсчета с интервалом в 1 секунду.

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

Я уже перепробовал все, что вы предлагали, включая TotalHours, TotalMinutes и т. д., Но я просто не могу получить ярлык, который отсчитывает время.

Так что спасибо, что уделили мне время.

OriginalGriff

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

Это не сложная задача: и если вы сойдете с коня и займетесь своим мозгом в течение пяти минут вместо того, чтобы ожидать, что другие просто дадут вам весь код, вы его решите.

Но удачи вам!