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

Composants VCL Delphi Discussion :

Retard réalisé avec un Timer


Sujet :

Composants VCL Delphi

  1. #1
    Invité
    Invité(e)
    Par défaut Retard réalisé avec un Timer
    Bonjour.
    Si je configure un timer avec une période de 800 ms et que je l'active, il va me générer des interruptions périodiques toutes les 800 ms (à la précision, minable, près : environ 35% ! ). Peut-on être sûr que ce timer démarrera toujours avec un cycle complet, c'est-à-dire que la première interruption ne se déroulera pas AVANT la période ? Et qu'en est-il si le timer est désactivé avant la fin de la période et réactivé après, je n'ai pas trouvé de méthode "Reset" ? Je cherche à générer un retard unique d'environ 800 ms, pour cela j'ai configuré mon timer sur 20 ms et j'utilise un décompteur de 40 à 0 (le timer est désactivé à la fin), comme cela en cas de cycle incomplet la précision serait (à peu près) prévisible, mais j'aimerais bien simplifier mon prg si possible. J'ai eu quelques soucis avec l'instruction "Sleep", voir mon post "Garanti réalisé sans trucage" dans la section "Langage".Comme dit l'imprécision de 35~40% est tolérable, bien qu'il y ait du "matos derrière" : une touche "panique" au clavier peut venir interrompre le cycle dudit timer.
    Merci d'avance.
    Dernière modification par tourlourou ; 29/10/2013 à 11h17. Motif: ajout du lien vers la discussion citée

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    Et pourquoi serait-il exécuté avant

    Avec ton compteur, tu ne fais que multiplier l'imprécision ! Une erreur de 35-40% sur 20ms est parfaitement normal dû à la précisions même du timer. Elle descendrait à 1% sur 800ms... (hors retard dans le traitement par ton application bien sûr)
    Arrêter le timer entraîne sa destruction (KillTimer). Le réactiver engendre la création d'un nouveau (SetTimer). Enabled := FALSE n'est pas une pause

  3. #3
    Invité
    Invité(e)
    Par défaut Merci pour ta réponse.
    Bonjour.
    Si je comprends bien, c'est la précision absolue, et non relative, du timer qui est à prendre en considération ... Intéressant !
    Merci de ta réponse qui résout parfaitement mes questions.
    Alberich

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    Points : 109
    Points
    109
    Par défaut
    Bonjour,

    Les timers sont précis à la valeur du quantum de windows.
    Au ring3 de l'OS, le quantum est donné à 10ms.
    Par conséquent, entre 1 et 10 ms, la pause donnée/attribuée par le système sera de 10 ms, entre 10 et 20 ms, elle sera de 20 ms, etc ...

    Pour augmenter cette précision, il faut utiliser la fonction timeBeginPeriod et timeEndPeriod de l'Api.
    Cette fonction permet de ramener le quantum a 1 ms.

    Une autre solution consiste à utiliser un timer multimedia.
    A ta disposition
    Christophe MERLIER

  5. #5
    Invité
    Invité(e)
    Par défaut Topic résolu ...
    Merci à tous pour vos réponses, mais maintenant tous mes timers sont réglés à la durée totale, 800 ou 1000 suivant les besoins, et ils ne génèrent qu'une seule interruption par laquelle ils sont désactivés. La nécessité d'une interruption périodique et d'un compteur logiciel est donc obsolète grâce à vos réponses.

    Cordialement,
    Alberich

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    Points : 109
    Points
    109
    Par défaut
    Bonjour,

    Mon intervention était plus liée à la précision du timer et la fonction Sleep.
    A ta disposition
    Christophe MERLIER

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    Le timer système est par défaut à exactement 15.6 ms (Windows 7) mais il n'a rien à voir avec les timers définis dans une application. L'événement du timer survient effectivement lorsque le temps défini est révolu mais sur le prochain tick du timer système.

    Hors installation du timer (qui prend un certain temps) et hors modification de la résolution (TimeBeginPeriod), sa précision varie donc de 0 à 15.6 ms et cela quelque soit sa durée.

    @ChMerlin: pour reprendre ton exemple en 10 ms : si un timer de 11 ms est installé alors que le tick système est survenu 9 ms avant, l'intervalle fera bien 11 ms et non 20

    mais je chipote...

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    Points : 109
    Points
    109
    Par défaut
    Bonsoir,

    Ta démonstration et ton exemple sont corrects pour les timers mais faux pour la pause (fonction Sleep).
    Je t'invite à essayer
    A ta disposition
    Christophe MERLIER

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    Sleep est encore différent puisqu'il agit sur la tâche en cours, dépend donc de la priorité du thread, de la durée passée en paramètre (0 ou différent de 0), de la priorité du processus et du nombre global de threads au niveau système. On redonne la main au système pour un temps minimum mais sans aucune garantie du temps maximum...
    Maintenant bien sûr que le traitement du WM_TIMER au niveau de l'application dépendra également de ces mêmes paramètres (ce n'est pas du temps réel), mais pas l'envoi du message par le système (enfin, je ne pense pas)

    Mais c'est vrai que l'exemple ci-dessus était dans une situation parfaite, un système qui se tourne les pouces

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

Discussions similaires

  1. problem avec un timer
    Par ridouani dans le forum C++
    Réponses: 5
    Dernier message: 20/09/2005, 17h43
  2. Problème de navigation réalisé avec CSS
    Par Mihai dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 18/09/2005, 19h51
  3. [Thread] Probleme avec mon Timer
    Par Nico66 dans le forum EDT/SwingWorker
    Réponses: 10
    Dernier message: 02/06/2005, 18h10
  4. [PIC] Pause avec les timers
    Par Ekinoks dans le forum Assembleur
    Réponses: 1
    Dernier message: 08/05/2005, 00h04
  5. [Débutant]Problème avec les timers
    Par mickael777 dans le forum MFC
    Réponses: 1
    Dernier message: 11/04/2005, 12h00

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