Escribir una función de reloj más eficiente
-
06-07-2019 - |
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.
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.