Синхронизировать таймер с реальным временем - PullRequest
1 голос
/ 11 июля 2020

Я пытаюсь обновлять sh мой кадр каждые 17ms с помощью timer.

Timer timer = new Timer(17);
timer.Elapsed += ResetFrame;
timer.Start();

Но вместо того, чтобы ждать 17ms, а затем повторять, он ждал обновления кадра sh для завершения, а затем дождитесь 17ms для следующего повтора. Это приводит к тому, что кадр обновляется каждые 28ms. Как синхронизировать с реальным временем?

1 Ответ

2 голосов
/ 11 июля 2020

Чтобы иметь таймер реального времени с очень коротким интервалом, вы можете взглянуть на эту статью:

Таймер реального времени в C#

В точке Net следующие таймеры не работают в реальном времени.

System.Windows.Forms.Timer
System.Timers.Timer
System.Threading.Timer

Означает, что вы хотите запускайте свой код каждые 100 миллисекунд, затем таймер срабатывает даже около 110 миллисекунд или позже. Windows не является ОС реального времени из-за этого. Net также не работает в реальном времени.

Чтобы создать таймер реального времени в C#, вы должны написать собственный код, который может удерживать процессор в запустите свой код в нужное время.

class Program
{
   static void Main(string[] args)
  {
    Console.ReadLine();
    Console.WriteLine("Running");
    RealTimeTimerTest obj = new RealTimeTimerTest();
 
    obj.Run();
  }
}
 
public class RealTimeTimerTest
{
   List<DateTime> lst = new List<DateTime>();
  System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
 
  public void Run()
  {
    int Tick = 100;
    int Sleep = Tick - 20;
    long OldElapsedMilliseconds = 0;
    sw.Start();

    while (sw.IsRunning)
    {
      long ElapsedMilliseconds = sw.ElapsedMilliseconds;
      long mod = (ElapsedMilliseconds % Tick);

      if (OldElapsedMilliseconds != ElapsedMilliseconds && (mod == 0 || ElapsedMilliseconds > Tick))
      {

        //-----------------Do here whatever you want to do--------------Start
        lst.Add(DateTime.Now);
        //-----------------Do here whatever you want to do--------------End

        //-----------------Restart----------------Start
        OldElapsedMilliseconds = ElapsedMilliseconds;
        OldElapsedMilliseconds = 0;
        sw.Reset();
        sw.Start();
 
        System.Threading.Thread.Sleep(Sleep); 
         //-----------------Restart----------------End
      }
       
      //------------Must define some condition to break the loop here-----------Start

      if (lst.Count > 500)
      {
        Write();
        break;
      }
      //-------------Must define some condition to break the loop here-----------End
    }
  }

 
  private void Write()
  {
    System.IO.StreamWriter sw = new System.IO.StreamWriter("d:\\text.txt", true);
    foreach (DateTime dtStart in lst)
      sw.WriteLine(dtStart.ToString("HH:mm:ss.ffffff"));    sw.Close();
  }
}

Также:

Самый точный таймер в. NET?

Таймер высокого разрешения

Таймер высокого разрешения C#

микросекунды и миллисекунды C# Таймер

Точность-Повтор-Действие-Интервал-Асинхронный c -Метод

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