Написание более эффективной функции синхронизации

StackOverflow https://stackoverflow.com/questions/269692

Вопрос

У меня есть функция часов в VB.NET программе, которая отображает время, включая секунды.В настоящее время у меня есть таймер, который постоянно опрашивает, используя NOW.Мне приходится довольно часто опрашивать системные часы, потому что мне нужно синхронизировать второе обновление с системными часами.

Есть ли более прямой способ получить доступ ко времени только при смене секунд?

Есть ли более эффективный способ написать этот код?

Если вам понадобится дополнительная информация, дайте мне знать.

Это было полезно?

Решение

Почему бы не использовать компонент timer?Это предполагает, что вы используете графический интерфейс, а не создаете сервис.

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

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

Обновить:

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

Обновление 2:

Основываясь на отзывах от Shog9, я думаю, что это может быть лучшим подходом, чем опрос:

Public Class Form1
   Private WithEvents clockTimer As New Timer
   Private currentTime As DateTime = DateTime.MinValue

   Private Sub ClockTick(ByVal sender As Object, _
      ByVal e As System.EventArgs) Handles clockTimer.Tick

      UpdateTimer()
      DisplayTimer()
   End Sub

   Private Sub UpdateTimer()
      currentTime = DateTime.Now

      clockTimer.Stop()
      clockTimer.Interval = 1000 - currentTime.Millisecond
      clockTimer.Start()
   End Sub

   Private Sub DisplayTimer()
      lblTime.Text = currentTime.ToString("T")
   End Sub

   Private Sub Form1_Load(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles MyBase.Load

      UpdateTimer()
      DisplayTimer()
   End Sub
End Class

Теперь, основываясь на моих предварительных тестах, с каждым тиковым событием наблюдается своего рода дрейф.На моей машине это время варьировалось от 12 до 20 миллисекунд.Если у кого-то есть идея о том, как надежно исправить дрейф, мне было бы интересно узнать.

Другие советы

Используйте объект Timer, установите его " интервал " равным 0, установите его «включено» к истине. Это будет срабатывать примерно каждые 15 миллисекунд (в зависимости от конфигурации вашего оборудования). В этом методе установите MyLabel.Text = DateTime.Now.ToString () (или все, что вы делаете).

Это превосходно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top