Pregunta

Tengo una función de reloj en un programa VB.NET que muestra la hora, incluidos los segundos. Actualmente tengo un temporizador que consulta constantemente con NOW. Tengo que sondear el reloj del sistema con bastante frecuencia porque necesito tener la segunda actualización sincronizada con el reloj del sistema.

¿Hay un acceso más directo al tiempo solo cuando cambian los segundos?

¿Hay una manera más eficiente de escribir este código?

Si necesita más información, hágamelo saber.

¿Fue útil?

Solución

¿Por qué no usar el componente del temporizador? Esto supone que está utilizando una GUI y no está creando un servicio.

Puede llamar a una rutina de sincronización que realizó el sondeo para acercar el temporizador a los segundos, y luego delegar en el temporizador. Puedes llamar a la rutina de sincronización una vez por minuto más o menos para asegurarte de que no obtienes ninguna deriva del sistema operativo.

Dicho esto, estoy seguro de que hay una manera de detectar el evento de cambio de segundos, simplemente no sé cómo hacerlo.

Actualización:

Este enlace tiene una implementación similar a la que estaba imaginando. ¡Solo modifíquelo para que no quede permanentemente atrapado en un bucle y listo! Tienes tu rutina de sincronización.

Actualización 2:

Según los comentarios de Shog9, creo que este podría ser un mejor enfoque que las encuestas:

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

Ahora, según mis pruebas preliminares, hay algún tipo de deriva con cada evento Tick. En mi máquina, variaba entre 12 y 20 milisegundos. Si alguien tiene una idea sobre cómo corregir de manera confiable la deriva, me interesaría aprender.

Otros consejos

Use un objeto Timer, establezca su " intervalo " a 0, establezca "habilitado" a la verdad Eso se disparará aproximadamente cada 15 milisegundos (según la configuración de su hardware). En ese método, establezca MyLabel.Text = DateTime.Now.ToString () (o lo que sea que esté haciendo).

Eso es perfectamente eficiente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top