Est-il possible d'écrire une commande afin qu'il annule un appel de fonction en cours d'exécution?
Question
J'ai un widget temps écoulé mesures, puis après une certaine durée, il effectue une commande. Toutefois, si le widget reste que je veux, je le veux pour annuler cet appel de fonction et ne pas faire la commande.
Comment puis-je aller à ce sujet?
La solution
Utilisez le module threading
et commencer un nouveau thread qui exécutera la fonction.
Il suffit de faire avorter la fonction est une mauvaise idée que vous ne savez pas si vous interrompez le fil dans une situation critique. Vous devriez prolonger votre fonction comme ceci:
import threading
class WidgetThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self._stop = False
def run(self):
# ... do some time-intensive stuff that stops if self._stop ...
#
# Example:
# while not self._stop:
# do_somthing()
def stop(self):
self._stop = True
# Start the thread and make it run the function:
thread = WidgetThread()
thread.start()
# If you want to abort it:
thread.stop()
Autres conseils
Pourquoi ne pas utiliser des fils et arrêter ça? Je ne pense pas qu'il soit possible d'intercepter un appel de fonction dans un seul programme fileté (sinon avec une sorte de signal ou d'interruption).
En outre, votre problème spécifique, vous voudrez peut-être présenter un drapeau et vérifier que dans la commande.
aucune idée de fils de python, mais en général la façon dont vous interrompez un fil est en ayant une sorte d'un objet d'état threadsafe que vous pouvez définir à partir du widget, et la logique dans le code de fil pour vérifier le changement d'objet d'état la valeur et de sortir de la boucle de fil.