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

JavaScript Discussion :

Vitesse Timer JS et réalité


Sujet :

JavaScript

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 15
    Par défaut Vitesse Timer JS et réalité
    Bonjour,

    je cherche à faire utiliser un timer tout simple en JS.
    J'utilise http://code.google.com/p/jquery-timer/ qui est plutot simple d'utilisation.

    Le problème que je rencontre avec tous les scripts de ce genre c'est que les secondes qui passent sont trop rapides ou trop lentes.

    Si je fais tourner le compteur pendant plusieurs minutes en même temps qu'un vrai chronomètre je m'apperçoit qu'il y a un décallage de plus en plus grand.

    Avez-vous une idée pour résoudre ce pb?
    Est-ce que ça dépend du navigateur?
    Auquel cas il faut que je trouve une solution générique.

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    C'est un problème qu'il faudrait soulever au créateur de la librairie.
    Selon les navigateurs les fonctions setTimeout et setInterval n'ont pas la même précision. Je pense qu'il y a une précision un peu meilleure avec setInterval. Pour vraiment être parfaitement synchro, il faut régulièrement compenser les écarts en récupérant à nouveau la date.

    Quelque-chose comme ça :

    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
    var timer = {
       loop: function(){
     
         //code à appeler toutes les secondes ici
     
          timer.tick++;
          var now = Date.now();
          var dateWanted = timer.lastTickDate + 1000;
          var delta = now - dateWanted;
          timer.timeout = setTimeout(timer.loop, 1000 - delta);
          timer.lastTickDate = dateWanted;
          console.log("Tick "+timer.tick +"("+delta+"ms d'écart)");
       },
       start: function(){
          this.tick = 0;
          this.lastTickDate = Date.now()-1000;
          this.loop();
       }
    }; 
     
    timer.start();

  3. #3
    Membre très actif

    Avatar de nicosmash
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2012
    Messages : 395
    Par défaut
    Bonjour,

    J'utilise :
    setTimeout(votreFonction,TempsMs);

    Voici la doc :
    http://www.w3schools.com/js/js_timing.asp

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 15
    Par défaut ça marche
    Merci SylvainPV,
    t'as solution fonctionne très bien, on rattrape le décallage.

    Pour amener un complément de solution j'ai juste rajouter les fonctions pour arrêter et réinitialiser le compteur.

    Merci encore.

    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
    25
    26
     
    var timer = {
        loop: function(){
     
            //code à appeler toutes les secondes ici
            timer.tick++;
            var now = Date.now();
            var dateWanted = timer.lastTickDate + 1000;
            var delta = now - dateWanted;
            timer.timeout = setTimeout(timer.loop, 1000 - delta);
            timer.lastTickDate = dateWanted;
            console.log("Tick "+timer.tick +"("+delta+"ms d'écart)");
        },
        start: function(){
            this.lastTickDate = Date.now()-1000;
            this.loop();
        },
        stop: function(){
            clearTimeout(timer.timeout)
        },
        reset: function() {
            this.stop();
            timer.tick=0;
        }
     
    };

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [] [Réseau] Anti-timer, anti-idle
    Par clonevince dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 15/01/2003, 22h19
  2. Timer de précision
    Par guigui dans le forum MFC
    Réponses: 1
    Dernier message: 04/12/2002, 15h21
  3. Timer en µsecondes
    Par Dagobert dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 25/11/2002, 00h59
  4. Vitesse de compilation
    Par srvremi dans le forum C++Builder
    Réponses: 5
    Dernier message: 30/07/2002, 16h49
  5. Vitesse de la mémoire vidéo
    Par Anonymous dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 06/06/2002, 20h20

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