VB.NETプログラムに、秒を含む時間を表示する時計機能があります。私は現在、NOWを使用して常にポーリングしているタイマーを持っています。2番目の更新をシステムクロックと同期させる必要があるため、システムクロックを頻繁にポーリングする必要があります。
秒が変わったときにだけ時刻にアクセスするためのより直接的な方法はありますか?
このコードを書くためのより効率的な方法はありますか?
さらに情報が必要な場合はお知らせください。
VB.NETプログラムに、秒を含む時間を表示する時計機能があります。私は現在、NOWを使用して常にポーリングしているタイマーを持っています。2番目の更新をシステムクロックと同期させる必要があるため、システムクロックを頻繁にポーリングする必要があります。
秒が変わったときにだけ時刻にアクセスするためのより直接的な方法はありますか?
このコードを書くためのより効率的な方法はありますか?
さらに情報が必要な場合はお知らせください。
なぜタイマー コンポーネントを使用しないのですか? これは、GUI を使用しており、サービスを構築していないことを前提としています。
ポーリングを実行する同期ルーチンを呼び出して、変化する秒数に非常に近いタイマーを取得し、タイマーに委譲することができます。OS のドリフトが発生していないことを確認するために、同期ルーチンを 1 分に 1 回程度呼び出すことができます。
そうは言っても、秒の変更イベントを検出する方法があると確信していますが、その方法がわかりません。
アップデート:
このリンクには、私が思い描いていたものと同様の実装があります。永久にループに陥らないように変更するだけで、出来上がりです! 同期ルーチンがあります。
更新 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 ミリ秒の間で変動しました。ドリフトを確実に修正する方法について誰かがアイデアを持っているなら、私は学ぶことに興味があります.
Timerオブジェクトを使用し、「interval」を0に設定し、「enabled」をtrueに設定します。これは、およそ15ミリ秒ごとに起動します(ハードウェア構成に基づく)。そのメソッドで、MyLabel.Text = DateTime.Now.ToString()(または実行しているもの)を設定します。
それは完璧に実行されます。