Définir, démarrer et visualiser une horloge non système.

Septi34000 Messages postés 2 Date d'inscription mercredi 12 juillet 2023 Statut Membre Dernière intervention 12 juillet 2023 - 12 juil. 2023 à 12:51
Whismeril Messages postés 19035 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024 - 12 juil. 2023 à 19:11

Bonjour,

Je souhaite juste afficher une horloge dans un label ou Textbox. J'ai défini l'heure de départ dans un MaskedTextBox.
Je n'arrive à déclarer le temps: Time as DateTime ?
Puis ensuite et surtout comment récupérer ma valeur MaskedTextBox pour lancer mon horloge.
La suite avec timer.start(), tick et Time\3600 , time Mod 3600 \ 60 etc ne devrait pas me poser de problème.

C'est juste démarrer à partir de Time qui ne démarre pas à 0 me pose problème et son format. Merci d'avance pour vos éclaircissements.
 

5 réponses

dysorthographie Messages postés 92 Date d'inscription jeudi 27 janvier 2022 Statut Membre Dernière intervention 3 avril 2024 5
12 juil. 2023 à 13:17

Bonjour,

Il te faut un timer1 qui regarde si l'heure est égal MaskedTextBox et qui enclache timer2.start

0
Whismeril Messages postés 19035 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024 656
Modifié le 12 juil. 2023 à 15:01

Bonjour 

tout d'abord, Mod n'est pas une instruction VB.Net, mais un import inapproprié de VB6.

Je t'invite à lire ceci https://codes-sources.commentcamarche.net/faq/11151-pourquoi-mon-code-vb6-vba-ne-marche-pas-en-vb-net et à appliquer les conseils détaillés dans le tuto et rappelés dans la conclusion.


Ensuite, la réponse de dysorthographie est complètement hors sujet si je comprends bien ta question.

Donc, je reformule mon interprétation (que tu confirmeras ou pas).

Tu as une heure (H0) que tu saisis dans une MaskedTextBox (on reviendra sur ce choix plus tard).

Ensuite, d'une façon ou d'une autre (un clic sur un bouton par exemple), tu veux que le temps s'égraine à partir de H0.

Et pour ça tu veux utiliser un timer.


Voyons, maintenant, comment j'aborderai la chose telle que je la comprends.

Heure ou durée. Ça n'est pas la même chose, ce choix aura des conséquences sur la suite.

  • Une heure est intiment liée à une date, d'ailleurs le type en .Net c'est DateTime. Je tape cette ligne à 14:24 le 12 juillet 2023. Une heure passe de 23:59:59 à 00:00:00 et la date change.
  • Une durée, c'est une quantité de temps depuis un moment, j'ai tapé les lignes précédentes 14:24 après le moment 12/07/2023 00:00:00. Une durée peut être négative (comme le décompte avant le décollage d'une fusée) et dépasser 23:59:59 (on parle régulièrement de 48h, 72h, ou de 156h pour un mois de travail par exemple). En .Net le type dédié à la durée est TimeSpan

Il est donc important que tu précises si tu veux un DateTime ou un TimeSpan


Le MaskedTextBox

  • Avantage, empêche la majorité des erreurs de saisie de l'utilisateur
  • Inconvénient, comme tu l'as soulevé, c'est du texte, pas du temps, mais ça se traite
    • DateTime.Parse, DateTime.TryParse
    • TimeSpan.Parse, TimeSpan.TryParse
    • Convert.To....
  • Défaut potentiel, à ma connaissance, il n'y a pas de masque qui te garantisse une vraie heure (si tu veux un DateTime), 35:79:86 sera probablement accepté par le masque.
  • Alternatives,
    • le DateTimePricker te permet de faire choisir un DateTime à l'utilisateur.
    • Pour le TimeSpan, on trouve des projets sur github et/ou Nuggets.
    • Utiliser la validation de données du MaskedEditBox avec les méthodes TryParse

Quel que soit ton choix final, il te faudra une variable du type adapté.

Ensuite, on calculera la somme entre l'heure ou la durée de départ et la durée écoulée depuis le départ de ton "horloge".

Bon jusque-là, j'enfonce des portes ouvertes, tout ça c'est des bases, et si ça n'est pas le cas pour toi, alors tu devrais lire ça (jusqu'au bout, la caricature du début, sert ensuite à l'argumentation)


Régularité/exactitude :

Qu'on se le tienne pour dit, tu n'auras pas de régularité en .Net, et tu n'auras une incertitude faible qu'au moment où tu arrêteras ton horloge (si tu codes ton horloge au mieux).

Si tu veux que plus ou moins toutes les secondes, le temps affiché soit exact à plus ou moins une seconde, alors tu peux utiliser un timer qui va faire la somme de variable H0 et du temps écoulé sur un StopWacth  (déclenché au démarrage de l'horloge) et la stocker dans la variable Hn.

Ensuite, il faudra convertir la valeur de Hn en texte (simplement avec sa méthode ToString) et l'afficher. Le timer n'est absolument pas régulier (parfois plusieurs dizaines de ms d'écart), mais Hn aura quasiment l'incertitude de l'horloge système au moment de son calcul. Et, le délai d'affichage sera relativement faible puisque ton code est dans le thread principal.

Le fait de servir d'un stopwatch rattrapera les erreurs dues à l'irrégularité du timer.


Si tu veux plus précis (compliqué) plus régulier (très compliqué), il va te falloir bien connaitre le mutlithreading, et si tu veux juste savoir pourquoi un timer n'est pas régulier, au moins des notions dans ce domaine.


0
Septi34000 Messages postés 2 Date d'inscription mercredi 12 juillet 2023 Statut Membre Dernière intervention 12 juillet 2023
12 juil. 2023 à 17:38

Merci tout les deux !
C'est très pertinent et intéressant Whismeril ! 
En fait, je veux juste entrer dans mon petit programme (une boite à outils pour un jeu de sous marin), l'heure locale du jeu, et avec un système d'envoi et de décodage du code morse que j'ai fais, juste lors de la sauvegarde dans un fichier ,  mettre l'heure devant chaque message reçu et envoyé.
Je viens de procéder comme suivant :

- 3 Textbox (H,M,s) pour définir l'heure locale du jeu (arrgh le MaskedTextBox !)
- Conversion de la somme des 3 TextBox en secondes qui défini la valeur de Time.
- Lancement du timer

  heure = time \ 3600 Mod 24
  minutes = (time Mod 3600) \ 60
   secondes = (time Mod 3600) Mod 60
time +=1

puis  affichage dans les mêmes Textbox h,m et s.
L'affichage est un plus mais pas obligatoire puisque accessible dans le jeu, mais pas directement (erreur) au poste de radio.

Ca à l'air de tourner, mais maintenant que tu le dis Whismeril, je suppose que cette horloge ne va pas supporter les multiples Threading.Thread.Sleep entre chaque envoi de points ou de traits du morse ! Je n'ai pas essayé encore en jeu, je vais voir ce que ca donne.
Est-ce que quelque chose comme : Quand on entre l'heure locale du jeu, on calcule la différence avec l'heure système, et sans l'afficher et donc aussi sans timer, juste faire le débours au moment de l' "écrire" dans un fichier texte ? 
 

Je pense que je reviendrais te demander d'autres conseils Whismeril, au sujet de mon calcul de vitesse selon la fréquence de rotation des pales des bateaux ennemis, là, au poste de l'hydrophone !  J'utilise le stopwatch par contre pour ce calcul avec l'estimation et l'affichage de la vitesse en direct.

Merci encore ! 

0
dysorthographie Messages postés 92 Date d'inscription jeudi 27 janvier 2022 Statut Membre Dernière intervention 3 avril 2024 5
Modifié le 12 juil. 2023 à 19:07

pour un projet perso j'avais fait un truc comme ça!

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'Controls("PictureBox" + i.ToString).Visible = False
        i += 1 : If i > 3 Then i = 1
        'Controls("PictureBox" + i.ToString).Visible = True
        Select Case i
            Case 1 : Timer1.Stop()
            Case 2 : Label1.Text = "00:00:00,000" : RaiseEvent Clear()
            Case 3 : D = Date.Now : Timer1.Start()
        End Select
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Label1.Text = (Date.Now - D).ToString()
    End Sub
0
Whismeril Messages postés 19035 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024 656
12 juil. 2023 à 19:11

Oui à plus ou moins une seconde

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19035 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024 656
Modifié le 12 juil. 2023 à 19:10

D'abord, je pars du principe que l'échelle de temps de ton jeu est le temps réel.
 

Clairement, l'intérêt principal du timer, c'est que la méthode abonnée au passage de l'intervalle est dans le thread principal et Donc permet de jouer sur l'affichage.

Dans ton cas un TimeSpan qui contient l'écart entre l'heure du PC et l'heure de début de ta partie. Puis un calcul entre l'heure système à l'instant où tu en as besoin et cet écart est judicieux et là aussi tu auras une bonne exactitude.



Mais si tu veux pouvoir jouer sur l'échelle, accélérer certaines phases de transition (Ce qui pourrait s'avérer judicieux si tu pars de Brest pour rejoindre New York).

Alors ce n'est pas une bonne solution. Le timer pourrait en être une avec les inconvénients déjà décrits, le stopwatch relancé à chaque changement d'échelle de temps couplé à un coefficient serait une bonne option à mon avis.


0
Rejoignez-nous