Таймер запускается поздно, поэтому показывает время, которое на секунду позже, чем фактическое время - PullRequest
0 голосов
/ 18 декабря 2010

У меня есть таймер.Но он начинается на секунду позже. Я имею в виду, я синхронизирую время по таймеру.Но время в часах, которые обновляются через таймер, на одну секунду меньше, чем фактическое время, прошедшее.Таймер запускается на секунду позже.Как настроить мой таймер для запуска в нужное время, чтобы показать реальное время?это код внутри события тика:

 if (currentState == play)
 {
     m_StatusLabel.Text = String.Format("Playing {0} ", format(timeCounter));
     timeCounter++;
 }

Здесь timeCounter обновляется с каждой секундой.

Ответы [ 4 ]

3 голосов
/ 18 декабря 2010
Таймеры

Стандарт System.Windows.Forms не дают никаких гарантий относительно «качества метронома». Для этого вам понадобится либо Systems.Threading.Timer, либо System.Timer.

Ссылка: Сравнение классов таймеров в библиотеке классов .NET Framework

0 голосов
/ 19 декабря 2010

Показать номер 1 больше:

if (currentState == play)
     m_StatusLabel.Text = String.Format("Playing {0} ",
                                        format(++timeCounter) );

Примечание

Пожалуйста, рассмотрите причину тех, кто предложил отображать истекшее время как текущее время - время начала . Так обычно это делается. Это более точно; таймер может быть нерегулярным в загруженной системе. По-прежнему возможно обновлять отображаемое значение каждую секунду. Псевдокод здесь для now(). Это требует получения текущего времени и выполнения разницы во времени.

if (currentState == play)
     m_StatusLabel.Text = String.Format("Playing {0} ",
                                  format( (now() - start)/1000 );

Смотрите также:
1. DateTime.Subtraction
2. DateTime.Now

0 голосов
/ 18 декабря 2010

Таймер Windows дает только одну гарантию: он не сработает до истечения времени ожидания.В частности, поток никогда не получит событие таймера, пока в его очереди есть сообщения.

Следовательно, вы не можете использовать таймеры для реализации часов.Если вы хотите обновить сообщение о состоянии, чтобы показать, как долго что-то воспроизводилось, то вы можете попробовать это: запишите время начала, и когда тики вашего таймера получат текущее время, вычтите время начала и уберите разницу.Ваше сообщение о состоянии не будет обновляться ровно каждую секунду, но при его обновлении оно будет корректным.

0 голосов
/ 18 декабря 2010

Нет доступных таймеров, которые гарантируют точность истинного времени, даже System.Threading.Timer может это сделать. Например, когда вы просите Threading.Timer срабатывать за 30 мс, это может на самом деле занять 40 мс или 200 мс. Или, если вы попросите 1 секунду, он может сработать за 1,01 секунды. Это не займет много времени, прежде чем ваше время будет неточным.

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

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