質問

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()(またはあなたがやっていること)を設定します。

これは完全にパフォーマンスが優れています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top