Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Dernière révision Les deux révisions suivantes | ||
arret_thread [2008/04/02 17:50] tyrtamos |
arret_thread [2008/04/02 19:49] tyrtamos |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Comment arrêter un thread? ====== | ====== Comment arrêter un thread? ====== | ||
- | ===== Méthode avec le déclenchement d'une exception ===== | + | ===== 1- Méthode avec le déclenchement d'une exception ===== |
\\ | \\ | ||
Ligne 56: | Ligne 56: | ||
</ | </ | ||
- | ===== Méthode avec sys.settrace ===== | + | \\ |
+ | ===== 2- Méthode avec sys.settrace ===== | ||
- | L' | + | L' |
- | Quand on a compris, le code est très simple: on encadre la partie à examiner | + | J' |
+ | |||
+ | Quand on a compris | ||
+ | |||
+ | De l' | ||
On a encore 2 solutions: | On a encore 2 solutions: | ||
Ligne 66: | Ligne 71: | ||
* soit l' | * soit l' | ||
- | * soit on veut vraiment arrêter le thread, auquel cas on génère une exception " | + | * soit on veut vraiment arrêter le thread, auquel cas on génère une exception " |
- | Ce traçage ne fonctionne que dans les instructions des fonctions appelées, et pas dans les instructions qui seraient directement placées dans la méthode run. | + | Attention: ce traçage |
+ | Et cette méthode n'est pas compatible avec certains outils de développements qui ont déjà une fonction trace pour debugging (comme IDLE). | ||
+ | |||
+ | |||
+ | \\ | ||
<code python> | <code python> | ||
# | # | ||
Ligne 125: | Ligne 134: | ||
if self.arretthread: | if self.arretthread: | ||
raise ValueError (" | raise ValueError (" | ||
+ | # autre option possible: raise SystemExit() | ||
return self.trace | return self.trace | ||
Ligne 142: | Ligne 152: | ||
</ | </ | ||
- | ===== Méthode avec une sous-classe | + | \\ |
+ | ===== 3- Méthode avec une classe | ||
\\ | \\ | ||
Ligne 235: | Ligne 246: | ||
J'ai vérifié que ça fonctionnait sur Windows XP et sur Linux (opensuse 10.3). | J'ai vérifié que ça fonctionnait sur Windows XP et sur Linux (opensuse 10.3). | ||
+ | |||
+ | ===== Option pour debugging ===== | ||
+ | |||
+ | Avec les 2 méthodes précédentes basées sur la fonction sys.settrace(), | ||
+ | |||
+ | Voilà le code proposé. J'ai seulement repris la fonction trace. Il est de plus nécessaire d' | ||
+ | |||
+ | Je l'ai emprunté à l' | ||
+ | |||
+ | <code python> | ||
+ | import linecache | ||
+ | |||
+ | def trace(self, frame, event, arg): | ||
+ | if event==' | ||
+ | lineno = frame.f_lineno | ||
+ | filename = frame.f_globals[" | ||
+ | if filename == "< | ||
+ | filename = " | ||
+ | if (filename.endswith(" | ||
+ | filename.endswith(" | ||
+ | filename = filename[: | ||
+ | name = frame.f_globals[" | ||
+ | line = linecache.getline(filename, | ||
+ | print " | ||
+ | if self.arretthread: | ||
+ | raise ValueError (" | ||
+ | # autre option possible: raise SystemExit() | ||
+ | return self.trace | ||
+ | </ | ||
+ | |||
+ | Bien sûr, le " | ||
+ | |||
+ | Par exemple, dans la méthode numéro 2, l' | ||
+ | |||
+ | <code python> | ||
+ | __main__: | ||
+ | __main__: | ||
+ | __main__: | ||
+ | __main__: | ||
+ | __main__: | ||
+ | __main__: | ||
+ | .... | ||
+ | __main__: | ||
+ | __main__: | ||
+ | Arrêt du thread demandé | ||
+ | </ | ||
+ | |||
+ | |||