Fiabilité chronomètre

Signaler
Messages postés
46
Date d'inscription
samedi 26 octobre 2013
Statut
Membre
Dernière intervention
21 février 2020
-
Messages postés
14475
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 juillet 2020
-
Bonjour,
J'essaye de créer un chronomètre qui aura pour finalité de générer les temps à l'arrivée d'une course (comme pour un 100 m par exemple).
Exemple une course de 6 concurrents alignés au départ et à l'arrivée avec une touche du clavier je mémorise le temps de chaque concurrent dès qu'il franchit la ligne d'arrivée. Je voudrais obtenir une liste des temps d'arrivée où je pourrais ajouter en face de chaque temps le numéro de couloir correspondant.
J'ai commencé à écrire le programme en c# avec visual studio mais en essayant simplement le chronomètre il se trouve que ce dernier n'est absolument pas fiable et donne des temps
inexacts.
Je suis complètement néophyte pour Visual Studio et C#.
Ce chrono fera parti d'une application de gestion de compétition sur laquelle un étudiant travaille et lui non plus ne voit pas où est le problème.

Je vous remercie si vous pouvez me donner des pistes sur ce sujet.

Cordialement
AmiralS

https://www.cjoint.com/c/JBurnetBco6

5 réponses

Messages postés
46
Date d'inscription
samedi 26 octobre 2013
Statut
Membre
Dernière intervention
21 février 2020
1
Merci beaucoup d'avoir pris le temps de me donner toutes ces explications.

Je vais me lancer sur les pistes que tu m'as données mais pas avant une bonne nuit de sommeil.
Je reviendrai sur le forum dès que possible en fonction de ma vitesse d'assimilation de toutes ces notions qui sont nouvelles pour moi.

Encore merci et à bientôt
AmiralS
Messages postés
14475
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 juillet 2020
554
Le meilleur conseil que je puisse te donner c’est de mettre ton projet de côté quelques jours, le temps de suivre un cours en ligne pour acquérir les bases de C#.
Celui de Tahé est très bien https://tahe.developpez.com/dotnet/csharp/
Il ne fera pas de toi un codeur expert mais te donnera le socle nécessaire à ta formation
Messages postés
14475
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 juillet 2020
554
Bonsoir

pour poster un code, voir ce petit tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

As tu utilisé un timer?

Messages postés
46
Date d'inscription
samedi 26 octobre 2013
Statut
Membre
Dernière intervention
21 février 2020
1
Bonsoir,
Oui j'ai utilisé un Timer.

using System;
using System.Windows.Forms;

namespace Chronometre
{
    public partial class Form_Chrono : Form
    {

        public Form_Chrono()
        {
            InitializeComponent();
        }
        int h= 0;
        int m = 0;
        int s = 0;
        int ms = 0;
        private void timer_Tick(object sender, System.EventArgs e)
        {
            ms++;
            lab_Mili.Text = ms.ToString();
            if (ms >= 10)
            {
                ms = 0;
                s++;
                lab_S.Text = s.ToString();
                lab_Mili.Text = ms.ToString();


            }
            if (s >= 10) 
            {
                s = 0;
                m++;
                lab_M.Text = m.ToString();
                lab_S.Text = s.ToString();
            }
            if (m >= 60)
            {
                m = 0;
                h++;
                lab_H.Text = h.ToString();
                lab_M.Text = m.ToString();
            }

        }
        
        private void bt_demarrer_Click(object sender, System.EventArgs e)
        {
            timer.Enabled = true;
            timer.Interval = 100;
            timer.Tick += new EventHandler(timer_Tick);
            timer.Start();
        }

  
        private void bt_stop_Click(object sender, System.EventArgs e)
        {
            timer.Stop();
         }

        private void bt_reprendre_Click(object sender, System.EventArgs e)
        {
            timer.Start();
        }

        private void Bt_Split_Click(object sender, System.EventArgs e)
        {

        }

        private void bt_raz_Click(object sender, System.EventArgs e)
        {
            timer.Stop();
            timer.Dispose();
            ms = 0;
            s = 0;
            m = 0;
            h = 0;
        }
    }
}
Messages postés
14475
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 juillet 2020
554
Un timer ne répète pas un code à intervalle régulier.
Il exécute son code, puis attend un certain temps, et l’exécute à nouveau.
C’est le temps d’attente qui est stable.
Par contre le temps d’exécution de son code ne l’est pas.

Tu affiches des valeurs, dans des textbox, cependant le thread d’affichage peut être occupé ailleurs.
Du coup, l’exécution du code du timer attend que le textbox soit renseigné pour passer à l’instruction suivante.

Un coup, tout le code sera exécuté en disons 3 ms, la fois d’après en 5 ms et une autre fois en 2.

Une solution consiste à mesurer le temps d’exécution du code du timer (avec un stopwatch) et d’ajuster l’intervalle à chaque itération.
Seulement, il y a une limite à cette méthode.
Admettons que tu veuilles être précis à 10 ms, le code du timer ne pourras pas excéder ce temps, cela impliquerait qu’il doit redémarrer avant d’avoir finit. Et je te l’ai expliqué plus haut, un timer ne marche pas comme ça.

Une bonne solution est d’utiliser un thread et un stopwatch.

Au click tu lances le stopwatch, puis le thread.
Le thread va régulièrement lire le stopwatch sans l’arrêter.
Il transmet la mesure au thread d’affichage, attention tu n’as pas le droit d'accéder directement à un contrôle depuis un thread, tu auras une erreur.
Il faut gérer avec un dispatcher et des invoke.

Au click suivant, tu arrêtes le stopwatch, tu arrêtes le thread et tu affiches la valeur chronométrée.

Le rafraîchissement ne sera peut-être pas tout à fait exact, mais bien mieux qu’un timer. Et la valeur finale, elle sera ce que le pc, et ton doigt font de mieux.

Il y a un tuto sur les pool de thread sur développez.com, il est en 4 parties.
Ce problème et une implémentation de solution y sont abordés.

Par contre, le multi thread c’est un peu compliqué pour un débutant.


Ps: il y a des types exprès pour représenter le temps: DateTime et TimeSpan, et ils permettent une représentation en string parfaitement personnalisable sans réinventer le système sexagésimal.
Messages postés
14475
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 juillet 2020
554
Note, qu’en remplaçant le thread par un timer, et avec un seul textbox qui affiche le TimeSpan du stopwatch, ça devrait être assez stable au rafraîchissement.
Et comme le timer (s’il est lancé depuis le formulaire) est dans le Thread principal, pas d’erreur crss thread lors de l’affectation des contrôles.