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 :

parametre threading timer


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 13
    Par défaut parametre threading timer
    bonjour,

    je voudrais utiliser la fonctionnalité timer du module threading
    mais je n'arrive pas a passer des arguments a la classe

    un exemple est montre sur le site mais sans passage de parametre

    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
    32
    33
    class MyTimer:
        def __init__(self, tempo, target, args= [], kwargs={}):
            self._target = target
            self._args = args
            self._kwargs = kwargs
            self._tempo = tempo
     
     
        def _run(self):
            self._timer = threading.Timer(self._tempo, self._run)
            self._timer.start()
            self._target(*self._args, **self._kwargs)
     
        def start(self):
            self._timer = threading.Timer(self._tempo, self._run)
            self._timer.start()
     
        def stop(self):
            self._timer.cancel()
     
    def gabarit():
         print unstr, time.clock()
     
     
    Te=0.5
    a = MyTimer(Te,gabarit,["MyTimer"])
     
     
    a.start()
    time.sleep(5.5)
    print "Timer arrete"
    a.stop()
    time.sleep(2.0)

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Je ne sais pas si j'ai bien compris ce que tu veux, mais il me semble qu'il manque simplement le paramètre unstr à la fonction gabarit pour que cet exemple soit fonctionnel:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def gabarit(unstr):
        print unstr, time.clock()
    Et s'il te plaît, utilise la balise [code] ! Merci Guigui_ !

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je ne comprend pas bien ce que tu veux faire, mais tu devrais regarder directement le code source du module threading.py qui se trouve dans lib. Le code concernant Timer est d'une vingtaine de lignes, et il est très intéressant. On y apprend, par exemple, que threading.Timer est une fonction, et pas une classe. C'est cette fonction qui appelle la classe threading ._Timer. Tu pourras voir aussi comment les arguments passés à la fonction threading.Timer (au delà de tempo et target) finissent par être transmis à la fonction target. Et pour un besoin plus complexe, tu devrais pouvoir créer une classe dérivée de threading._Timer, ou t'inspirer du code pour faire ta propre classe.

    Tyrtamos

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 13
    Par défaut timer threading
    En fait,

    je voudrais appeler une fonction tous les 50 ms, laquelle effectue
    un traitement mathematique et stocke tous les pas de calcul dans
    un csv.
    j'ai vu que la classe timer du module threading possede deux arguments (args et kwargs), mais je n'ai pas pu passer mes parametres
    a la fonction.

    je vais essayer de comprendre la librairie en interne,
    pour voir ce que je peux faire

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Voilà un petit code simplet qui montre la transmission des arguments.

    Au lancement, le programme principal initialise le timer, le lance et attend qu'il ait terminé (join()).

    Le timer attend 5 secondes et lance le calcul avec les 2 arguments fournis présentés sous forme de tuple.

    Le timer se termine alors, ce qui permet au programme principal de poursuivre et d'afficher le résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    import threading
     
    result=0
     
    def calcul(x,y):
        global result
        result=x*y
     
    c=threading.Timer(5,calcul,(2,3))
    c.start()
    c.join()
     
    print result
    Les arguments passés ici sous forme d'un tuple peuvent être suivis par des arguments nommés, présentés alors sous forme d'un dictionnaire.

    Tyrtamos

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 13
    Par défaut merci
    merci tyrtamos,

    tu m'as donné des idées,
    du coup j'ai repris mon exemple ci_dessus, et j'ai ajouté
    une phase d'init, on peut ainsi initialiser les parametres au premier
    lancement

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    import csv
    import threading
    import time
     
     
    class MyTimer:
        def __init__(self, tempo, target, args= [], kwargs={}):
            self._target = target
            self._args = args
            self._kwargs = kwargs
            self._tempo = tempo
            self.record_data  = []
            self.state  = "INIT"
     
     
        def _run(self):
            self._timer = threading.Timer(self._tempo, self._run)
            self._timer.start()
            self.state = self._target(self.state,*self._args, **self._kwargs)
     
        def start(self):
            self._timer = threading.Timer(self._tempo, self._run)
            self._timer.start()
     
        def stop(self):
            self._timer.cancel()
     
        def display(self):
            print self.record_data
     
     
     
    def calcul(state,x,y):
     
        if state == "INIT":
            result = x+y+8
            state  = "RUN"
        else:
            result = x+y+7
        print result
        return state
     
     
     
     
     
     
     
    ## main
     
    Te=0.05
    input = 2
    a = MyTimer(Te,calcul,(2,3))
     
     
    a.start()
    time.sleep(2)
    print "Timer arrete"
    print a.display():D
    a.stop()
    time.sleep(2.0)

Discussions similaires

  1. Exception in thread "Timer-x"
    Par nono44200 dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 14/08/2007, 19h24
  2. Thread + timer
    Par Drazharian dans le forum Général Python
    Réponses: 2
    Dernier message: 26/06/2007, 15h14
  3. Thread + Timer CallBack
    Par crevygood dans le forum Windows Forms
    Réponses: 1
    Dernier message: 05/06/2007, 10h44
  4. Thread Timer et Tcomposant
    Par cfalcot dans le forum Delphi
    Réponses: 11
    Dernier message: 19/12/2006, 10h00
  5. [MFC] Problème de Threads + Timers
    Par Invité dans le forum MFC
    Réponses: 8
    Dernier message: 30/11/2005, 10h51

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