IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Quel chrono est le plus précis ?


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 20
    Points
    20
    Par défaut Quel chrono est le plus précis ?
    Bonjour à tous,

    Enfait, j'ai créé une applet où j'ai besoin d'un chrono ultra précis (les temps max seront de l'ordre de 5 minutes). J'ai besoin d'un chrono allant seulement jusqu'au 10ème de secondes, pas plus!

    SVP un exemple concret et complet, ou un lien!

    Merci d'avance!
    Cordialement

    Pat-trix

  2. #2
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 93
    Points : 109
    Points
    109
    Par défaut
    Au moment de déclencher ton chrono tu crées un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long startTime = System.getCurrentTimeMillis();
    Au moment d'arrêter le chrono:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long timeElapsed = startTime - System.getCurrentTimeMillis();
    En fait tu récupères le temps processeur en millisecondes au début et à la fin, puis tu fais la différence des deux.

  3. #3
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par pat-trix
    En fait, j'ai créé une applet où j'ai besoin d'un chrono ultra précis (les temps max seront de l'ordre de 5 minutes). J'ai besoin d'un chrono allant seulement jusqu'au 10ème de secondes, pas plus!
    "ultra-précis" et "10e de seconde", c'est un peu contradictoire...

    Java te permet même la nanoseconde (1 milliardième de seconde)...
    (avec System.nanoTime()).

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par ®om
    Java te permet même la nanoseconde (1 milliardième de seconde)...
    (avec System.nanoTime()).
    Précision : nanoTime() renvoi un temps en nanoseconde, mais ne garantit pas une précision de ce niveau là (la précision peut varier selon l'OS cible)


    a++

  5. #5
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par adiGuba
    Précision : nanoTime() renvoi un temps en nanoseconde, mais ne garantit pas une précision de ce niveau là (la précision peut varier selon l'OS cible)
    C'est sûr, d'autant que sur un processeur 2 GHz par exemple, 1 nanoseconde ne représente que 2 instructions d'1 cycle d'horloge... Et certaines instructions prennent plus de cycles que ça...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 20
    Points
    20
    Par défaut
    Merci pour vos réponse;

    Enfait je vais être moi aussi plus précis...:

    J'aimerais avoir un chrono ultra préci au dixième de seconde car j'aimerais simplment qu'après 5.0 réelles minutes il affiche bien un temps de 5.0 minutes. Car actuellement mon chrono (fait avec un timer) prend environ 5 secondes de retard sur 30 secondes. Comme le but de mon applet et de faire une régate en moins de temps possible, cela n'a pas de sens si pas les joueurs sur le web n'ont pas la même bas de temps!! En effet, ce retard varie...c'est cela que j'appelle "pas précis"

    La proposition de Babaôrom peut être intéressante, mais je pense pas qu'elle permette d'afficher le temps courant...?

    J'ai vu sur le web la possibilité de faire un chrono a partir de 3 timers simultanés pour plus de précision ! Mais je n'arrive pas à accéder au code source...


    Merci d'avance

    Cordialement

    Pat-trix

    Patrick

  7. #7
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par pat-trix
    La proposition de Babaôrom peut être intéressante, mais je pense pas qu'elle permette d'afficher le temps courant...?
    Bah, pourquoi pas?

    Tu fais un System.out.println et voilà ça t'affiche ce que tu veux...

    Sinon, pour faire un timer, utilise simplement java.util.Timer (pour le modèle) ou javax.swing.Timer (pour la vue)...

    Pas besoin de 3 timers ou 50 timers...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 20
    Points
    20
    Par défaut
    Rom, tu arriverais à me faire un exemple concret qui utiliserait System.GetCurrentMillis, parce-que pas à me faire une idée...oublie pas que je suis un débutant avéré...!
    Et enfait, j'ai laissé tomber la possibilité d'utiliser uniquement un seul timer, car comme dit, le temps n'est vraiment pas assez précis sur 30 sec --> 5 sec de retard, il me faut quelque chose de beaucoup plus fiable.

    Merci d'avance!
    Cordialement

    Pat-trix

  9. #9
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par pat-trix
    Et enfait, j'ai laissé tomber la possibilité d'utiliser uniquement un seul timer, car comme dit, le temps n'est vraiment pas assez précis sur 30 sec --> 5 sec de retard, il me faut quelque chose de beaucoup plus fiable.
    Qu'as-tu utilisé comme Timer?
    Tu dois avoir un problème d'implémentation...
    notamment il faut choisir entre schedule et scheduleAtFixedRate (regared la doc de java.util.Timer)

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 20
    Points
    20
    Par défaut
    Voici le code de mon Timer: il me semble que c un swing.Timer...en tt cas au niveau des imports: javax.swing.Timer


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     ActionListener tache_timer = new ActionListener() {
            public void actionPerformed(ActionEvent el) {
     
                dixiemeseconde++;
     
                if (dixiemeseconde == 10) {
                    dixiemeseconde = 0;
                    seconde++;
                }
                if (seconde == 60) {
                    seconde = 0;
                    minute++;
                }
                if (minute == 60) {
                    minute = 0;
                    heure++;
                }
     
                lbChrono.setText((heure<10?"0":"")+(int) heure + ":" + (minute<10?"0":"")+(int) minute + ":" +
                                 (seconde<10?"0":"")+(int) seconde + ":" + (dixiemeseconde<10?"0":"")+dixiemeseconde);
            }
        };
        final Timer timer1 = new Timer(100, tache_timer);
    Cordialement
    Pat-trix

  11. #11
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    C'est normal, tu n'as aucune garantie que ton "actionPerformed" sera appelé toutes les 10e de millisecondes (et tu n'auras aucune méthode pour en être sûr, ça dépend de l'entrelacement de tes threads notamment).
    Donc il ne faut pas faire dixiemeseconde++, mais bien mettre à jour le délai écoulé en fonction du currentTimeMillis de départ et celui que tu viens de calculer...

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 20
    Points
    20
    Par défaut
    Rom, merci pour ton aide!
    Est ce que je pourrais te demander d'être plus clair (avec quelque chose de concret) stp?

    Merci d'avance,

    Cordialement

    Pat-trix

  13. #13
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    En fait, tu veux juste chronométrer quelque chose, tu n'as pas besoin d'avoir la valeur du chrono toutes les 100ms environ?

    Si c'est ça, c'est tout simple (c'est ce qu'a dit Babaôrom):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    long startTime = System.getCurrentTimeMillis();
    tonTraitementLong();
    long timeElapsed = startTime - System.getCurrentTimeMillis();
    Si tu veux afficher le temps toutes les 100ms, tu fais un timer qui changera la valeur de ton textfield par exemple, où tu mettras simplement à jour ce timeElapsed...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class MonActionListener implements ActionListener() {
     
        private long startTime = System.getCurrentTimeMillis();;
     
        public void actionPerformed(ActionEvent el) {
     
            long timeElapsed = startTime - System.getCurrentTimeMillis();
            String timeElapsedText = ...// conversion en texte du timeElapsed
     
            lbChrono.setText(timeElapsedText);
        }
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final Timer timer1 = new Timer(100, new MonActionListener());

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 20
    Points
    20
    Par défaut
    Merci Rom!

    En fait, j'aimerais bien que l'utilisateur ait un repère au niveau de son temps. Donc si il n'y a que les secondes pendant la course et que "le reste" soit affiché à la fin de la course, c'est parfait!

    Hum, j'ai essayé ton code, il y a une faute dans la défénition de l'ActionListener...: 'Class ou Interface attendu'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    ActionListener atimer4= new ActionListener(){
     
        class atimer4 implements ActionListener{
            private long startTime=System.currentTimeMillis();
            public void actionPerformed(ActionEvent e1){
                long timeElapsed = startTime-System.CurrentTimeMillis();
                String timeElapsedText= String.ValueOf(timeElapsed);
                lbChrono.setText(timeElapsed);
            }
     
        }
     
    };
     
    final Timer timer4= new Timer(100, new atimer4);

    Mais si j'ai bien compris, on prend le nbr de milliseconde depuis 1970 quand la course à commencé et ensuite on recalcul ce même nombre en milliseconde à la fin de la course et on en déduit les secondes, minutes etc. Est ce que cela marcherait?

    Je ne comprend pas pourquoi on soustrairerait le premier CurrentTimeMillis du second??

    Merci d'être précis et concis ;_)

    Cordialment

    Pat-trix

  15. #15
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par pat-trix
    Hum, j'ai essayé ton code, il y a une faute dans la défénition de l'ActionListener...: 'Class ou Interface attendu'[/Code]
    C'est pas dans mon code, c'est dans le tien

    Ta classe que j'ai appelée "MonActionListener" ne doit être définie en tant que classe anonyme...

    [QUOTE=pat-trix]Mais si j'ai bien compris, on prend le nbr de milliseconde depuis 1970 quand la course à commencé et ensuite on recalcul ce même nombre en milliseconde à la fin de la course et on en déduit les secondes, minutes etc. Est ce que cela marcherait?

    Citation Envoyé par pat-trix
    Je ne comprend pas pourquoi on soustrairerait le premier CurrentTimeMillis du second??
    Bah, pour avoir le nombre de millisecondes écoulées entre les 2...

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 20
    Points
    20
    Par défaut
    Oula, scuse pour mes questions bêtes...xD.
    Voila, alors maintenant je prend le currentTimeMillis au début et a la fin de la course... Je les soustrait l'un de l'autre et je trouve 0 !! Comment est-ce possible ??
    Voici les valeurs:

    StartTIme 1163862125498

    ElapsedTime 1163862125498

    Votre temps:: 0

    (Alors que si je met un System.out.println(currentTimeMillis) dans un thread les valeur changent ! (d'ailleur ce sont bien des millisecondes?)

    Merci
    Cordialement

    Pat-trix

  17. #17
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    C'est que tu as fait une erreur... Tu es sûr que tu affectes bien un nouveau System.currentTimeMillis() pour le temps de fin?

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 20
    Points
    20
    Par défaut
    Bah voici en gros comment mes tests se font:

    lorsqu'on passe la ligne de départ{
    StartTime=System.currentTimeMillis();
    }

    ... environ 1-4 minutes s'écoulent

    lorsqu'on repasse sur la ligne de départ (après avoir dû passer un certains nombre de points){
    ElapsedTime=System.currentTimeMillis();
    FinalTime=ElapsedTime-StartTime;
    System.out.println("Votre temps:: "+FinalTime);

    }

    Mais StartTime et ElapsedTime sont les mêmes...

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 20
    Points
    20
    Par défaut
    Ah non! Excuse moi la première valeur indique:

    FinalTime=ElapsedTime-StartTime= 2273

    C'est absurde, cela correspond a 2,273 secondes si je ne me trompe ? alors que j'ai fait une course d'au moins 1minute 20 secondes...

    Merci Cordialement

    Pat-trix

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 20
    Points
    20
    Par défaut
    Milles excuses, j'ai trouvé ma faute. Tout marche et c'est vraiment précis!
    Merci beaucoup!

    Maintenant, serait-il possible de faire Pause/Revenir à la course=? (Car c'était naturellmeent possible avec un Timer)


    Cordialement
    Pat-trix

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Quel langage est le plus difficile à décompiler ?
    Par islogged dans le forum Langages de programmation
    Réponses: 12
    Dernier message: 23/10/2014, 17h59
  2. Réponses: 31
    Dernier message: 09/06/2010, 08h45
  3. [Choix] Quel framework est le plus indiqué dans mon cas ?
    Par ptr83 dans le forum Frameworks Web
    Réponses: 12
    Dernier message: 14/03/2008, 12h10
  4. Quel langage est le plus adapté pour faire ce script ?
    Par koKoTis dans le forum Langages de programmation
    Réponses: 8
    Dernier message: 15/08/2006, 19h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo