45 votes

Filetage annulable.Timer en Python

J'essaie d'écrire une méthode qui compte jusqu'à un temps donné et à moins qu'une commande de redémarrage ne soit donnée, elle exécutera la tâche. Mais je ne pense pas que la classe Python threading.Timer permette que la minuterie soit annulable.

import threading

def countdown(action):
    def printText():
        print 'hello!'

    t = threading.Timer(5.0, printText)
    if (action == 'reset'):
        t.cancel()

    t.start()

Je sais que le code ci-dessus est erroné. J'aimerais avoir de bons conseils par ici.

16voto

Adam Points 955

Je ne sais pas si je comprends bien. Voulez-vous écrire quelque chose comme dans cet exemple ?

>>> import threading
>>> t = None
>>> 
>>> def sayHello():
...     global t
...     print "Hello!"
...     t = threading.Timer(0.5, sayHello)
...     t.start()
... 
>>> sayHello()
Hello!
Hello!
Hello!
Hello!
Hello!
>>> t.cancel()
>>>

1voto

Fernando Ubeda Points 21

Je ne sais pas si la meilleure option, mais pour moi se réveille comme ceci : t = timer_mgr(.....) ajouter à la liste "timers.append (t)" et après tout créé, vous pouvez appeler :

for tm in timers:#threading.enumerate():
     print "********", tm.cancel()

ma classe timer_mgr() est la suivante :

class timer_mgr():
def __init__(self, st, t, hFunction, id, name):
    self.is_list = (type(st) is list)
    self.st = st
    self.t = t
    self.id = id
    self.hFunction = hFunction      
    self.thread = threading.Timer(t, self.handle_function, [id])
    self.thread.name = name

def handle_function(self, id):
    if self.is_list:
        print "run_at_time:", datetime.now()
        self.hFunction(id)
        dt = schedule_fixed_times(datetime.now(), self.st)
        print "next:", dt
        self.t = (dt-datetime.now()).total_seconds()
    else:
        self.t = self.st        
        print "run_every", self.t, datetime.now()
        self.hFunction(id)

    self.thread = threading.Timer(self.t, self.handle_function, [id])
    self.thread.start()             

def start(self):
    self.thread.start()

def cancel(self):
    self.thread.cancel()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X