より効率的なクロック関数を書く
-
06-07-2019 - |
質問
VB.NETプログラムには、秒を含む時刻を表示する時計機能があります。現在、NOWを使用して常にポーリングするタイマーがあります。システムクロックと同期した2番目の更新が必要なため、システムクロックを頻繁にポーリングする必要があります。
秒が変更されたときにのみ時間にアクセスするための直接的な方法はありますか?
このコードを記述するより効率的な方法はありますか?
詳細情報が必要な場合はお知らせください。
解決
タイマーコンポーネントを使用しない理由これは、GUIを使用しており、サービスを構築していないことを前提としています。
ポーリングを実行する同期ルーチンを呼び出して、タイマーを秒の変化に非常に近づけてから、タイマーに委任することができます。同期ルーチンを1分に1回程度呼び出して、OSドリフトが発生しないことを確認できます。
それは言われていますが、秒単位で変化するイベントを検出する方法があると確信しています。どうすればいいのかわかりません。
更新:
このリンクには、私が思い描いていたものと同様の実装があります。それを修正するだけで、永久にループに巻き込まれてしまうことはありません!同期ルーチンがあります。
更新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に、「有効」に設定します;本当に。これは、お使いのハードウェア構成に基づいて、およそ15ミリ秒ごとに起動します。そのメソッドで、MyLabel.Text = DateTime.Now.ToString()(またはあなたがやっていること)を設定します。
これは完全にパフォーマンスが優れています。