Ecrire une fonction d'horloge plus efficace
-
06-07-2019 - |
Question
J'ai une fonction d'horloge dans un programme VB.NET qui affiche l'heure, y compris les secondes. J'ai actuellement une minuterie qui interroge constamment en utilisant NOW. Je dois souvent interroger l'horloge système car la deuxième mise à jour doit être synchronisée avec l'horloge système.
Existe-t-il un accès plus direct au temps uniquement lorsque les secondes changent?
Existe-t-il un moyen plus efficace d'écrire ce code?
Si vous avez besoin de plus d'informations, faites-le-moi savoir.
La solution
Pourquoi ne pas utiliser le composant timer? Cela suppose que vous utilisez une interface graphique et non un service.
Vous pouvez appeler une routine de synchronisation qui effectue l'interrogation pour que le temporisateur se rapproche du nombre de secondes, puis déléguer ce dernier. Vous pouvez appeler la routine de synchronisation une fois par minute environ pour vous assurer de ne pas avoir de dérive du système d'exploitation.
Cela étant dit, je suis sûr qu'il existe un moyen de détecter l'événement qui change en quelques secondes, je ne sais tout simplement pas comment le faire.
Mise à jour:
Ce lien a une implémentation similaire à celle que j'avais envisagée. Il suffit de le modifier pour que vous ne soyez pas coincé dans une boucle permanente et le tour est joué! Vous avez votre routine de synchronisation.
Mise à jour 2:
D'après les commentaires de Shog9, je pense que cette approche pourrait être meilleure que les sondages:
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
Maintenant, sur la base de mes tests préliminaires, il y a une sorte de dérive avec chaque événement Tick. Sur ma machine, cela variait entre 12 et 20 millisecondes. Si quelqu'un a une idée sur la façon de corriger la dérive de manière fiable, cela m'intéresserait d'apprendre.
Autres conseils
Utilisez un objet Minuteur, définissez son "intervalle". à 0, définissez cette option "activée" " à vrai. Cela se déclenchera environ toutes les 15 millisecondes (en fonction de votre configuration matérielle). Dans cette méthode, définissez MyLabel.Text = DateTime.Now.ToString () (ou ce que vous faites).
C'est parfaitement performant.