Arrêter un thread en python ?
Bonjour,
J'ai commencé le Python depuis peu, mon pb est le suivant:
je démarre un thread de scrutation du port serie à l'aide d'un GUI qui est déclaré de la maniére suivante:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
def Com_Watcher():
c = 0
# scrutation du buffer d'entree
while 1:
while c == 0:
c=com1.inWaiting()
car = com1.read()
com1.flushInput()
if ord(car) == etat_cap_d1:
action ... |
Arrêter un thread en python ?
Bonjour,
J'ai commencé le Python depuis peu, mon pb est le suivant:
je démarre un thread de scrutation du port serie à l'aide d'un GUI qui est déclaré de la maniére suivante:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
def Com_Watcher():
c = 0
# scrutation du buffer d'entree
while 1:
while c == 0:
c=com1.inWaiting()
car = com1.read()
com1.flushInput()
if ord(car) == etat_cap_d1:
action ...
ComWatcher = threading.Thread(None,Com_Watcher,"comwatcher")
ComWatcher.setDaemon(1) |
ensuite le thread est lancé lors de l'appui sur un bouton start par :
ComWatcher.start()
Mon problème est pour le stopper , ou le suspendre car je dois pouvoir le relancer ; car les threads ne peuvent pas être directement contrôlés de "l'extérieur" dixit O'reilly.
Faut'il redéfinir une classe thread ?
Si quelqu'un a une solution, je suis preneur.
Merci de votre aide.
SA
Une petite réponse, bien plus tard...
Bonjour bonjour,
je réveille un file qui m'a bien aidé. Cependant, une petite précision : voilà comment je code mes thread- j'espère ne pas faire de grosses fautes, malgré :
Citation:
16.2.1. Thread Objects¶
This class represents an activity that is run in a separate thread of control. There are two ways to specify the activity: by passing a callable object to the constructor, or by overriding the run() method in a subclass. No other methods (except for the constructor) should be overridden in a subclass. In other words, only override the __init__() and run() methods of this class.
Code:
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
| class maThread(threading.Thread):
def __init__(self, *args, **kwargs):
"""Initialisation de la thread, partie qui ne se joue qu'une seule fois."""
threading.Thread.__init__(self)
self.running = True
# Ici, on peut récupérer les variables et même initialiser le port série
# par exemple.
def run(self):
"""Partie de programme qui se répète."""
while self.running:
# Ici le contenu de la thread, ou la fonction que la thread appelle.
def stop(self):
"""Permet un arrêt propre de la thread."""
self.running = False
def main():
thread1 = maThread()
thread1.start()
# la suite du programme, jusqu'à devoir arreter la thread à l'aide de :
thread1.stop()
thread1.join(1) # 1s de timeout
# la suite du main()
if __name__ == '__main__':
"""Lancement du fichier seul."""
status = main()
sys.exit(status) |
Une petite remarque : thread1.join() retourne none, que la thread se soit arrêtée, ou que le timeout ait expiré. Il faut donc ensuite faire thread1.is_alive() pour savoir si la thread est encore en route, ou non.
En espérant que cela puisse aider...