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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top