Почему бы не использовать компонент таймера? Это предполагает, что вы используете графический интерфейс, а не создаете службу.
Вы можете вызвать процедуру синхронизации, которая выполнила опрос, чтобы таймер был очень близок к секундам, а затем делегировать его таймеру. Вы можете вызвать процедуру синхронизации раз в минуту или около того, чтобы убедиться, что вы не получаете никакого дрейфа ОС.
Это, как говорится, я уверен, что есть способ обнаружить событие изменения секунд, я просто не знаю, как это сделать.
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 миллисекунд. Если у кого-то есть идея о том, как надежно исправить дрейф, мне было бы интересно учиться.
Вы предлагаете сидеть в петле и опросить системные часы? – Shog9 2008-11-06 18:36:14
Только временно. После определения точки перегиба вы вызываете системный таймер с событиями. – 2008-11-06 18:42:50