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 | ||
arret_thread [2008/04/02 18:01] tyrtamos |
arret_thread [2008/04/12 08:45] 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 57: | Ligne 57: | ||
\\ | \\ | ||
- | ===== 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' | De l' | ||
Ligne 72: | Ligne 74: | ||
Attention: ce traçage //ne fonctionne que dans les instructions des fonctions appelées//, | Attention: ce traçage //ne fonctionne que dans les instructions des fonctions appelées//, | ||
+ | |||
+ | 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). | ||
Ligne 149: | Ligne 153: | ||
\\ | \\ | ||
- | ===== Méthode avec une sous-classe | + | ===== 3- Méthode avec une classe |
\\ | \\ | ||
Ligne 242: | 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é | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <style type=" | ||
+ | <!-- | ||
+ | body {background-image: | ||
+ | --> | ||
+ | </ | ||
+ | </ | ||
+ | < | ||
+ | </ | ||
+ | </ | ||