Точный таймер C# Timer (System.Windows.Forms)

276
12 апреля 2018, 10:58

Есть программа, которая в заданное время, по таймеру, копирует файлы. Значение времени копирования, указывается в DateTimePicker (отображает только время).

Значение времени из DateTimePicker записывается в переменную ScheduledTime, затем она сравнивается с DateTime.Now и если значение ScheduledTime меньше, то добавляется 1 день. Функция GetSetScheduledTime():

if (DateTime.Now > ScheduledTime)
   {
    while (DateTime.Now >= ScheduledTime)
      {
        ScheduledTime = ScheduledTime.AddDays(1);
        DateTimePickerTimer.Value = DateTimePickerTimer.Value.AddDays(1);
      }
   }

Цикл while используется для чтения даты из конфиг файла, где дата может быть старой.

После уточнения ScheduledTime получаем интервал TickTime для таймера:

  TickTime = (int)(GetSetScheduledTime() - DateTime.Now).TotalMilliseconds;
            if (TickTime >= 0)
            {
                TimerPl.Interval = TickTime;
                //Start Main Timer
                TimerPl.Start();
            }

После того, как таймер срабатывает, в функции TimerTick таймер останавливается, запускается функция копирования, отсылаются отчеты и записывается лог и снова запускается функция таймера, проверяется время, получается новый интервал и снова ждем следующего срабатывания.

Проблема в том, что время плавает. В первый день, на 2 разных компьютерах, таймер сработал точно, на второй день, сработал раньше на 1 секунду и на 2 секунды. Будет ли возрастать это время пока не ясно.

Я понимаю что таймер не является точным инструментом и тики могут запаздывать или идти быстрее. Но если у нас есть значение из DateTimePicker, где время не меняется, а только увеличивается на 1 день и потом это значение присваивается ScheduledTime и если я каждый раз получаю новый интервал который равен - время планирования - текущее время, разве должна или может ошибка накапливаться? Как этого избежать? Я не против люфта до 5 секунд, но если это значение будет постоянно возрастать, как корректировать время?

READ ALSO
Поиск изображения в изображении

Поиск изображения в изображении

Пишу автокликер для одной мобильной игры (скрин ниже)Задача находить на карте объекты

261
Работа со сценами Unity

Работа со сценами Unity

Всем привет, как загрузить сцену с дефолтными настройками и данными? SceneManagerLoadScene("sceneName"); загружает сцену, но это работает только при первом...

230
Как лучше всего проверить, что окно существует?

Как лучше всего проверить, что окно существует?

Допустим, я пишу функцию, которая по значению дескриптора должна вернуть логическое значение, существует ли окно с таким дескрипторомЯ представляю...

202
Как получить состояние видеокарты NVIDIA?

Как получить состояние видеокарты NVIDIA?

Стоит задача, программно получить напряжение, и желательно нагрузку и частоты как в NVIDIA Inspector с видеокарт NVIDIAБыл реализован вариант с использованием...

204