Je veux déclencher une fonction toutes les 0,5 seconde et pouvoir démarrer, arrêter et réinitialiser la minuterie. Je ne connais pas trop bien le fonctionnement des threads Python et j'ai des difficultés avec le minuteur python.
Cependant, je reçois RuntimeError: threads can only be started once
quand j'exécute threading.timer.start()
deux fois. Y a-t-il une solution pour cela? J'ai essayé de postuler threading.timer.cancel()
avant chaque départ.
Pseudo code:
t=threading.timer(0.5,function)
while True:
t.cancel()
t.start()
python
python-3.x
python-2.7
user1431282
la source
la source
threading.Event
etwait
au lieu desleep
. Ensuite, pour le réveiller, réglez simplement l'événement. Vous n'avez même pas besoin duself.stopped
alors parce que vous vérifiez simplement le drapeau d'événement.event.wait
délai expirait et agirait comme un sommeil, mais si vous vouliez arrêter (ou interrompre autrement le thread), vous définiriez l'événement du thread et il se réveillerait immédiatement.thread.start()
me donnethreads can only be started once
De l' équivalent de setInterval en python :
Usage:
Ou voici la même fonctionnalité mais en tant que fonction autonome au lieu d'un décorateur :
Voici comment le faire sans utiliser de threads .
la source
@setInterval(1)
.stop = repeat(every=second, call=your_function); ...; stop()
.stop = call_repeatedly(interval, your_function); ...; stop()
implémentationUtilisation des threads de minuterie
cela peut être arrêté par
t.cancel()
la source
cancel
méthode. Lorsqu'il est appelé, le thread est soit 1) non en cours d'exécution, soit 2) en cours d'exécution. Dans 1), nous attendons d'exécuter la fonction, donc annuler fonctionnera correctement. dans 2) nous sommes en cours d'exécution, donc annuler n'aura aucun effet sur l'exécution en cours. de plus, l'exécution en cours se replanifie d'elle-même pour ne pas avoir d'effet dans le futur.En améliorant un peu la réponse de Hans Then , nous pouvons simplement sous-classer la fonction Timer. Ce qui suit devient l' intégralité de notre code de "minuterie de répétition", et il peut être utilisé comme remplacement de threading.Timer avec tous les mêmes arguments:
Exemple d'utilisation:
produit la sortie suivante:
et
produit
la source
RuntimeError: threads can only be started once
.threading.py
module lui-même.Dans l'intérêt de fournir une réponse correcte en utilisant Timer comme l'OP l'a demandé, je vais améliorer la réponse de swapnil jariwala :
la source
J'ai changé du code dans le code swapnil-jariwala pour créer une petite horloge de console.
Minuterie avec une interface graphique tkinter
Ce code met l'horloge dans une petite fenêtre avec tkinter
Un exemple de jeu de cartes mémoire (en quelque sorte)
production:
la source
Je devais faire ça pour un projet. Ce que j'ai fini par faire était de démarrer un thread séparé pour la fonction
**** Le battement de coeur est ma fonction, le travailleur est l'un de mes arguments ****
à l'intérieur de ma fonction de rythme cardiaque:
Ainsi, lorsque je démarre le thread, la fonction attendra à plusieurs reprises 5 secondes, exécutera tout mon code et le fera indéfiniment. Si vous voulez tuer le processus, il suffit de tuer le thread.
la source
J'ai implémenté une classe qui fonctionne comme une minuterie.
Je laisse le lien ici au cas où quelqu'un en aurait besoin: https://github.com/ivanhalencp/python/tree/master/xTimer
la source
Voici un petit échantillon, cela vous aidera à mieux comprendre comment il fonctionne. function taskManager () à la fin crée un appel de fonction retardé à lui-même.
Essayez de changer la variable "dalay" et vous pourrez voir la différence
la source
J'aime la réponse de right2clicky, en particulier en ce qu'elle ne nécessite pas la suppression d'un Thread et la création d'un nouveau à chaque fois que le Timer tourne. De plus, il est facile de créer une classe avec un rappel de minuterie qui est appelé périodiquement. C'est mon cas d'utilisation normal:
la source
Il s'agit d'une implémentation alternative utilisant la fonction au lieu de la classe. Inspiré par @Andrew Wilkins ci-dessus.
Parce que wait est plus précis que sleep (il prend en compte l'exécution de la fonction):
la source
J'ai mis au point une autre solution avec la classe SingleTon. S'il vous plaît dites-moi si une fuite de mémoire est là.
la source