2012-02-04 4 views
0

Я начинаю программировать. Это мой код:Получение времени работы программы

private void timer1_Tick(object sender, EventArgs e) 
{ 
    sec++; 
    textBoxSeconds.Text = sec.ToString(); 
    if (sec > 59) 
    { 
     sec = 0; 
     textBoxSeconds.Text = sec.ToString(); 
     min++; 
     textBoxMinutes.Text = min.ToString(); 
    } 
} 

Время идет слишком быстро, и иногда оно останавливается на несколько секунд. Надеюсь, что кто-то может мне помочь :) * EDIT // * спасибо за помощь :) он работает, но у меня все еще есть проблема, о которой я раньше не упоминал. почему-то останавливается на 1-2 секунды, почему. возможно, из-за некоторых циклов?

+1

* «время останавливается иногда на 1-2 секунды» * - похоже, что вы блокируете поток пользовательского интерфейса, поэтому пользовательский интерфейс не обновляется за это время («зависает») - длительные операции должны выполняться на другом поток, например используя BackgroundWorker. Эта проблема не в коде, который вы здесь показываете. – BrokenGlass

ответ

4

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

private DateTime startTime = DateTime.Now; 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    var delta = DateTime.Now - startTime; 
    textBoxSeconds.Text = delta.Seconds.ToString("n0"); 
    textBoxMinutes.Text = Math.Floor(delta.TotalMinutes).ToString("n0"); 
} 
+0

Извините за беспорядок с вашим ответом :-) – dtb

+0

@dtb: ваши изменения работают, спасибо ;-) - я предположил, что в течение нескольких часов было больше текстовых полей и т. Д., Поэтому я не беспокоился о опрокидывании – BrokenGlass

+0

DateTime.Now неверный подход тоже ... Вы всегда должны использовать DataTime.UtcNow для внутренних вычислений и настойчивости, если только он не привязан к дневному кадру (например, при планировании встреч и т. Д.).В вашем случае это предотвратит вас от ошибки, если часовой пояс будет изменен во время работы программы. –

1

Используя свой код, я, вероятно, может сказать, что вы не установили таймер Interval, так:

timer1.Interval = 1000; //1000 ms = 1 second

Тогда вы можете улучшить что-то в Tick события:

private void timer1_Tick(object sender, EventArgs e) 
{ 
    sec++; 

    if (sec == 60) 
    { 
     sec = 0; 
     min++; 
    } 

    textBoxSeconds.Text = sec.ToString(); 
    textBoxMinutes.Text = min.ToString(); 
} 

Так что используйте класс DateTime, это лучшее решение.

EDIT:

DateTime startTime = DateTime.Now; 

    void timer1_Tick(object sender, EventArgs e) 
    { 
     TimeSpan time = DateTime.Now - startTime; 
     textBoxSeconds.Text = string.Format("{0:0#}", time.Seconds); 
     textBoxMinutes.Text = string.Format("{0:0#}", time.Minutes); 
    } 
0

Я согласен о STARTTIME - это обязательно. Я также прокомментировал DataTime.UtcNow - это правильный путь.

О вашей второй проблеме с задержкой в ​​1..2 секунды - это потому, что таймеры таймера участвуют в бок о бок с секундами.

1) Если ваш таймер будет запущен в 998 мс вместо 1000 мс, вы можете прочитать такое же количество секунд, и это число останется перед следующим тиком.

2) Поскольку приложение не находится в режиме реального времени с точки зрения ОС, его можно удерживать в течение нескольких секунд (например, для воспроизведения мультимедийных материалов другим приложением), и вы можете заметить пропуск 1 секунду ...

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

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

Смежные вопросы