Frage

Ich habe eine Uhr-Funktion in einem VB.NET-Programm, das die Zeit, einschließlich den Sekunden anzeigt. Im Moment habe ich einen Timer ständig Polling NOW. Ich habe die Systemuhr recht häufig abzufragen, weil ich das zweite Update synchron mit dem Systemtakt haben muß.

Sie haben ein direktere, die Zeit für den Zugriff nur dann, wenn die Sekunden ändern?

Gibt es eine effizientere Möglichkeit, diesen Code zu schreiben?

Wenn Sie weitere Informationen benötigen, lassen Sie mich wissen.

War es hilfreich?

Lösung

Warum nicht die Timer-Komponente verwenden? Dies setzt voraus, dass Sie eine GUI verwenden und nicht den Aufbau einer Service.

Sie könnten eine Synchronisationsroutine aufrufen, die die Abfrage ausgeführt, um den Timer sehr nah an die Sekunden Wechsel zu bekommen, dann in den Timer delegieren. Sie könnten die Synchronisationsroutine einmal pro Minute anrufen oder so, um sicherzustellen, dass Sie keine OS Drift bekommen.

Dass gesagt wird, ich bin sicher, dass es einen Weg gibt, um die Sekunden veränderndes Ereignis zu erkennen, ich weiß nur nicht, wie es zu tun.

Update:

Dieser Link eine Implementierung ähnlich zu hat, was ich Vorstellungsvermögen. ändern Sie es einfach so, dass man nicht ständig in einer Schleife und voila stecken! Sie haben Ihre Sync-Routine.

Update 2:

Basierend auf dem Feedback von Shog9, ich denke, das könnte ein besserer Ansatz als Polling sein:

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

Nun, basierend auf meinem Vorversuche, gibt es eine Art von Drift mit jedem Tick-Ereignisse. Auf meinem Rechner, es variiert zwischen 12 und 20 Millisekunden. Wenn jemand eine Idee hat, wie zuverlässig die Drift zu korrigieren, würde ich das Lernen interessiert sein.

Andere Tipps

ein Timer-Objekt verwenden, stellen Sie es „Intervall“ auf 0 gesetzt, es wird „aktiviert“, um wahr. Das Feuer wird etwa alle 15 Millisekunden (basierend auf der Hardwarekonfiguration). Bei diesem Verfahren wird eingestellt MyLabel.Text = DateTime.Now.ToString () (oder was auch immer Sie tun).

Das ist durchaus performant.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top