Scrivere una funzione orologio più efficiente
-
06-07-2019 - |
Domanda
Ho una funzione orologio in un programma VB.NET che visualizza l'ora compresi i secondi. Al momento ho un timer che esegue costantemente il polling usando NOW. Devo eseguire il polling dell'orologio di sistema abbastanza spesso perché devo sincronizzare il secondo aggiornamento con l'orologio di sistema.
Esiste un metodo più diretto per accedere all'ora solo quando cambiano i secondi?
Esiste un modo più efficiente per scrivere questo codice?
Se hai bisogno di maggiori informazioni fammi sapere.
Soluzione
Perché non utilizzare il componente timer? Ciò presuppone che tu stia utilizzando una GUI e non stia creando un servizio.
È possibile chiamare una routine di sincronizzazione che ha eseguito il polling per avvicinare il timer ai secondi che cambiano, quindi delegare al timer. È possibile chiamare la routine di sincronizzazione una volta al minuto per assicurarsi che non si ottenga alcuna deriva del sistema operativo.
Detto questo, sono sicuro che c'è un modo per rilevare l'evento che cambia i secondi, non so proprio come farlo.
Aggiornamento:
Questo link ha un'implementazione simile a quella che stavo immaginando. Basta modificarlo in modo da non rimanere permanentemente bloccati in un loop e voilà! Hai la tua routine di sincronizzazione.
Aggiornamento 2:
Sulla base del feedback di Shog9, penso che questo potrebbe essere un approccio migliore rispetto al polling:
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
Ora, in base ai miei test preliminari, c'è una sorta di deriva con ogni evento Tick. Sulla mia macchina, variava tra 12 e 20 millisecondi. Se qualcuno ha un'idea su come correggere in modo affidabile la deriva, sarei interessato a imparare.
Altri suggerimenti
Utilizza un oggetto Timer, imposta il suo intervallo " intervallo " su 0, imposta è " abilitato " vero. Ciò si attiva all'incirca ogni 15 millisecondi (in base alla configurazione hardware). In quel metodo, imposta MyLabel.Text = DateTime.Now.ToString () (o qualunque cosa tu stia facendo).
È perfettamente performante.