C# Секундомер на лету обновление

(Мой первый вопрос здесь!) Привет, я новичок в С#. Я попытался построить простой таймер (в Windows.Forms). Я сделал метку, указывающую время, и использовал класс StopWatch (из system.diagnostics). Триггерным событием для запуска/остановки секундомера является событие KeyDown клавиши пробела. После второго касания секундомер останавливается, а Label.text присваивается значению Stopwatch.Elapsed. Я хочу постоянно обновлять этикетку, но не знаю как. Если я сделаю while(StopWatchName.IsRunning) в самом событии, событие будет продолжаться бесконечно и не будет реагировать на второй тап.

Заранее спасибо за любые идеи!


person matan129    schedule 06.05.2013    source источник


Ответы (3)


Вероятно, у вас должен быть часто срабатывающий таймер. (например, каждые 10 мс) — запускайте таймер при запуске секундомера и останавливайте таймер при остановке секундомера. Событие таймера просто установит свойство Text метки из секундомера.

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

person Jon Skeet    schedule 06.05.2013
comment
Почему я считаю, что использование Timer обречено на провал? Что я не так понял? Заранее спасибо! stackoverflow.com/questions/16496309/ - person Novemberland; 11.05.2013
comment
@Novemberland: вы упускаете тот факт, что разрешение таймера вообще не имеет значения. Пока он обновляет экран довольно часто, это нормально — именно Stopwatch отвечает за точность. - person Jon Skeet; 11.05.2013

Вероятно, вы захотите использовать System.Timers. Класс Timer для вызова функции каждые несколько секунд для обновления вашего пользовательского интерфейса значением истекшего времени.

Вот хороший пример: http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx

По сути, ваша функция события OnTimedEvent из примера — это то, что выполнит это в вашем коде.

РЕДАКТИРОВАТЬ: Джон прав (см. комментарии), вы должны использовать Forms.Timer, вы можете избежать маршалинга потоков. http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx

TimerEventProcessor будет интересующей функцией в этом примере.

person Matt Johnson    schedule 06.05.2013
comment
Было бы лучше использовать System.Windows.Forms.Timer, который будет автоматически запускаться в потоке пользовательского интерфейса, поэтому нет необходимости ни устанавливать объект синхронизации, ни использовать Control.Invoke. - person Jon Skeet; 06.05.2013

В следующем примере создается экземпляр объекта System.Timers.Timer, который запускает свое событие Timer.Elapsed каждые две секунды (2000 миллисекунд), настраивает обработчик событий для события и запускает таймер. Обработчик событий отображает значение свойства ElapsedEventArgs.SignalTime каждый раз, когда оно вызывается. (документ )

using System;
using System.Timers;

public class Example
{
   private static System.Timers.Timer aTimer;

   public static void Main()
   {
      SetTimer();

      Console.WriteLine("\nPress the Enter key to exit the application...\n");
      Console.WriteLine("The application started at {0:HH:mm:ss.fff}", DateTime.Now);
      Console.ReadLine();
      aTimer.Stop();
      aTimer.Dispose();

      Console.WriteLine("Terminating the application...");
   }

   private static void SetTimer()
   {
        // Create a timer with a two second interval.
        aTimer = new System.Timers.Timer(2000);
        // Hook up the Elapsed event for the timer. 
        aTimer.Elapsed += OnTimedEvent;
        aTimer.AutoReset = true;
        aTimer.Enabled = true;
    }

    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
                          e.SignalTime);
    }
}
// The example displays output like the following:
//       Press the Enter key to exit the application...
//
//       The application started at 09:40:29.068
//       The Elapsed event was raised at 09:40:31.084
//       The Elapsed event was raised at 09:40:33.100
//       The Elapsed event was raised at 09:40:35.100
//       The Elapsed event was raised at 09:40:37.116
//       The Elapsed event was raised at 09:40:39.116
//       The Elapsed event was raised at 09:40:41.117
//       The Elapsed event was raised at 09:40:43.132
//       The Elapsed event was raised at 09:40:45.133
//       The Elapsed event was raised at 09:40:47.148
//
//       Terminating the application...
person Tạ Lục Gia Hoàng    schedule 18.06.2020