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

Python Discussion :

Simuler deux timers non synchronisés


Sujet :

Python

  1. #1
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut Simuler deux timers non synchronisés
    Bonjour,

    J'ai bien vu la FAQ python et la partie timer.
    Autant, créer un timer ne me pose pas de problème, autant j'essaie de faire plus "subtil".
    J'aimerais simuler un timer de la forme suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    |\  |\  |\
    | \ | \ | \
    |  \|  \|  \
    En gros, il décrémente une valeur régulièrement, jusqu'à atteindre 0, et à ce moment là, il repasse à sa valeur de période.

    Mon soucis est aussi (surtout) d'en avoir deux, avec un décalage entre les deux (disons, le premier part et le second commence seulement 'offset' plus tard (ou inversement).

    Alors, basiquement, je le ferai avec une boucle et un sleep entre chaque décrément.
    Mais ça n'en simule pas deux...

    Pouvez-vous m'aider ?
    Merci d'avance !
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  2. #2
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 947
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Une idée, comme ça, si Tkinter ne te rebute pas. Il y a sûrement moyen de factoriser les timers, c'est juste l'idée.

    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
    27
    28
    29
    30
    31
    import Tkinter
     
    T1_RELOAD_VALUE = 123
    T1_PERIOD_VALUE = 10
    T2_RELOAD_VALUE = 40
    T2_PERIOD_VALUE = 60
     
    def T1_interrupt():
        value = t1.get()
        if value == 0:
            t1.set(T1_RELOAD_VALUE)
        else:
            t1.set(value-1)
        root.after(T1_PERIOD_VALUE, T1_interrupt)
     
    def T2_interrupt():
        value = t2.get()
        if value == 0:
            t2.set(T2_RELOAD_VALUE)
        else:
            t2.set(value-1)
        root.after(T2_PERIOD_VALUE, T2_interrupt)
     
    root = Tkinter.Tk()
    t1 = Tkinter.IntVar(value=T1_RELOAD_VALUE)
    t2 = Tkinter.IntVar(value=T2_RELOAD_VALUE)
    Tkinter.Label(root, textvariable=t1, width=20).grid()
    Tkinter.Label(root, textvariable=t2, width=20).grid()
    T1_interrupt()
    T2_interrupt()
    root.mainloop()

  3. #3
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Je n'ai pas d'a priori .
    Ca fait une partie de ce que je souhaite : deux timers qui décrémentent un compteur et reprennent à chaque fois.
    Donc, en mettant les reload et period à des valeurs identiques pour les deux timers, j'ai l'équivalent de deux timers en phase.

    Mais j'aimerais ajouter deux choses : un temps de décrément variable (genre, une seconde entre chaque décrément), et un offset entre les deux (l'un démarre N secondes avant l'autre).
    Est-il possible de tracer les courbes correspondantes ?
    Là, il y a un print, mais on peut sans doute faire un genre de "plot" ?
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  4. #4
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Eh eh, je m'auto-réponds, car je viens de comprendre...
    La période est en msec.
    Et je peux tout à fait faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    root = Tkinter.Tk()
    t1 = Tkinter.IntVar(value=T1_RELOAD_VALUE)
    t2 = Tkinter.IntVar(value=T2_RELOAD_VALUE)
    Tkinter.Label(root, textvariable=t1, width=20).grid()
    Tkinter.Label(root, textvariable=t2, width=20).grid()
    root.after(0, T1_interrupt)
    root.after(1000, T2_interrupt)
    root.mainloop()
    Pour décaler mes deux timers de 1 seconde l'un de l'autre.

    Du coup, il reste principalement l'idée de tracer le graphique
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  5. #5
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 947
    Points : 1 351
    Points
    1 351
    Par défaut
    Je te conseille matplotlib. La page "galerie" ci dessous est très bien, car elle te permet d'avoir d'un click le code correspondant au genre de tracé que tu cherches.
    http://matplotlib.sourceforge.net/gallery.html
    Les exemples donnés sont cependant statiques, il faudra pondre un peu de code pour avoir un plot dynamique.


    Donc, en mettant les reload et period à des valeurs identiques pour les deux timers, j'ai l'équivalent de deux timers en phase.
    Je crois que tu cours vers une désillusion, car la méthode after est comme la fonction sleep, totalement dépendante de la plateforme et très imprécise. Tes timers seront très vite totalement désynchronisés. A mon sens, il faudrait un timer très rapide qui donnerait les ticks de base à tes deux timers.

  6. #6
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    L'idée n'est pas d'avoir deux timers ultra précis, mais de simuler la synchronisation de deux timers l'un par rapport à l'autre .
    Du coup, il est possible d'avoir une variable partagée par les deux threads (les deux interruptions) ? Histoire que quand elle passe à 1 dans une interruption, l'autre le sache par exemple ?
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  7. #7
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 947
    Points : 1 351
    Points
    1 351
    Par défaut
    Citation Envoyé par progfou Voir le message
    Du coup, il est possible d'avoir une variable partagée par les deux threads (les deux interruptions) ? Histoire que quand elle passe à 1 dans une interruption, l'autre le sache par exemple ?
    Oui, les variables t1 et t2 sont globales, donc accessibles en lecture/écriture par les 2 interruptions.

  8. #8
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    OK, reste à trouver comment utiliser matplotlib pour tracer la courbe voulue...
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    sinon tu peux utiliser a mon avis, 1 timer mais a une fréquence compatible au deux timer, avec des évènement déclenché en fonction des valeurs du timer.

    Exemple : un timer 50 Htz et un timer 100 hert, deviens un seul et unique timer de 100 hertz avec un évènement tout les 100 htz / 2.

    enfin en théorie !!!!

Discussions similaires

  1. Comparaison de deux triplets non ordonnés
    Par ahparspasenrat dans le forum C++
    Réponses: 2
    Dernier message: 02/08/2007, 14h27
  2. Affichage de composants non synchronisés
    Par hugo1992 dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 01/04/2007, 19h19
  3. deux tables non liées dans un formulaire
    Par zermatt dans le forum IHM
    Réponses: 9
    Dernier message: 16/01/2007, 17h41
  4. Faire dialoguer deux EXE (non activex)
    Par Vld44 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 27/11/2006, 15h35
  5. [personal oracle9i] simuler deux bases distantes
    Par slim dans le forum Oracle
    Réponses: 4
    Dernier message: 14/02/2006, 19h11

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