Актуализация на C# Stopwatch в движение

(Първият ми въпрос тук!) Здравейте, начинаещ съм в c#. Опитах се да създам прост таймер (в Windows.Forms). Направих етикет, който показва часа, и използвах класа StopWatch (от system.diagnostics). Задействащото събитие за стартиране / спиране на хронометъра е събитието KeyDown за интервал. След второто докосване хронометърът спира и Label.text се присвоява на стойността Stopwatch.Elapsed. Искам непрекъснато да актуализирам етикета, но не знам как. Ако направя while(StopWatchName.IsRunning) в самото събитие, събитието ще продължи за неопределено време и няма да отговори при второто докосване.

Благодаря предварително за всякакви идеи!


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


Отговори (3)


Вероятно трябва да имате таймер, който се активира често (напр. на всеки 10ms) - стартирайте таймера, когато стартирате хронометъра, и спрете таймера, когато спрете хронометъра. Събитието за отметка на таймера просто ще зададе свойството 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. Клас таймер, за да извиквате функция на всеки няколко секунди, за да актуализирате потребителския си интерфейс със стойността на изминалото време.

Ето един добър пример: 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