Таймер отстает - PullRequest
       15

Таймер отстает

1 голос
/ 30 декабря 2011

Я хочу, чтобы в моем приложении был запущен таймер, отображающий секунды с точностью до 2 десятичных знаков, например, 2,31 секунды.Я использую System.Threading.Timer для этого и устанавливаю объект Timer для вызова функции refreshTimeBox() каждые 10 миллисекунд (потому что я хочу, чтобы секунды составляли до 2 десятичных знаков).Но таймер отстает.И с течением времени оно все больше отстает.Я предполагаю, потому что refreshTimeBox() занимает слишком много времени, чтобы завершить.Но я также попытался вместо этого вызывать refreshTimeBox() каждые 100 миллисекунд.Таймер все еще отстает.Единственное отличие состоит в том, что в этом случае задержка становится заметной после более длительного времени, чем в случае, когда я использую 10 миллисекунд в качестве интервала.У меня есть следующий код для инициализации таймера:

timer = new Timer(refreshTimeBox, null, 0, 10);

Ниже приведен код для refreshTimeBox:

public void refreshTimeBox(object param)
{
    time += 0.01f;
    Dispatcher.BeginInvoke(WriteTimeBox);
}

Ниже приведен код для WriteTimeBox:

public void WriteTimeBox()
{
    TimeBar.Text = time.ToString("0.00");
}

time - это переменная, в которой хранится прошедшее время, а TimeBar - это обновляемое текстовое поле.

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

Ответы [ 3 ]

3 голосов
/ 30 декабря 2011

Вы также можете использовать секундомер

        System.Diagnostics.Stopwatch sw=new System.Diagnostics.Stopwatch();
        sw.Start();

А в функции обновления

        TimeBar.Text = sw.ElapsedMilliseconds;

Тогда вам не нужно беспокоиться о проблемах с UTC

3 голосов
/ 30 декабря 2011

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

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

1 голос
/ 30 декабря 2011

Таймеры всегда имеют возможность отставания.Что вам нужно сделать, это сохранить при запуске, а затем сравнить его с текущим временем.

private DateTime startTime;
public void startTimer() {
    startTime = DateTime.Now;
}

public void refreshTimeBox(object param)
{
    Dispatcher.BeginInvoke(WriteTimeBox);
}

public void WriteTimeBox()
{
    TimeSpan ts = DateTime.Now - startTime;
    // See http://msdn.microsoft.com/en-us/library/1ecy8h51.aspx for TimeSpan formatting.
    TimeBar.Text = ts.time.ToString("s.ff");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...