2008-11-06 4 views
2

У меня есть функция часов в программе VB.NET, которая отображает время, включая секунды. В настоящее время у меня есть таймер с постоянным опросом, используя СЕЙЧАС. Я должен часто прорабатывать системные часы, потому что мне нужно синхронизировать второе обновление с системными часами.Написание более эффективной функции часов

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

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

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

ответ

5

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

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

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

Update:

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

Update 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 

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

+0

Вы предлагаете сидеть в петле и опросить системные часы? – Shog9 2008-11-06 18:36:14

+0

Только временно. После определения точки перегиба вы вызываете системный таймер с событиями. – 2008-11-06 18:42:50

0

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

Совершенно отлично.

 Смежные вопросы

  • Нет связанных вопросов^_^