Warning: Undefined array key "DOKU_PREFS" in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/common.php on line 2082
arret_thread [Les recettes Python de Tyrtamos]

Outils pour utilisateurs

Outils du site


arret_thread

Warning: Undefined array key -1 in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/html.php on line 1458

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

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'instruction sys.settrace() est utilisée dans le debugging. Son principe est de détourner l'exécution à chaque ligne d'instruction exécutée en lançant une fonction qui peut faire des tests. L'instruction sys.settrace() est utilisée dans le debugging. Son principe est de détourner l'exécution à chaque ligne d'instruction exécutée en lançant une fonction qui peut faire des tests.
  
-Quand on a compris, le code est très simple: on encadre la partie à examiner par une mise en place d'une fonction de traçage et sa désactivation. La fonction de traçage comporte un test sur un drapeau d'arrêt qui, s'il est True, va interrompre le déroulement normal du thread par le lancement d'une exception.+J'utilisais surtout la méthode précédente, mais elle ne s'applique pas pour arrêter, par exemple, un eval() parce qu'il n'y a pas de boucle pour insérer un test.  
 + 
 +Quand on a compris le principe, le code est très simple: on encadre la partie à surveiller par la mise en place d'une fonction de traçage et sa désactivation. La fonction de traçage comporte un test sur un drapeau d'arrêt qui, s'il est True, va interrompre le déroulement normal du thread par le lancement d'une exception.
  
 De l'extérieur du thread, il suffit d'appeler sa méthode stopthread() pour déclencher son arrêt. De l'extérieur du thread, il suffit d'appeler sa méthode stopthread() pour déclencher son arrêt.
Ligne 72: Ligne 74:
  
 Attention: 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 //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.
 +
 +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 modèle de threading.Thread =====+===== 3- Méthode avec une classe dérivée de threading.Thread utilisée comme nouveau modèle =====
  
 \\ \\
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(), si le fonctionnement n'est pas celui attendu, il y a une possibilité d'ajouter à la fonction de traçage des instructions pour examiner la liste des instructions interrompues.
 +
 +Voilà le code proposé. J'ai seulement repris la fonction trace. Il est de plus nécessaire d'importer le module linecache.
 +
 +Je l'ai emprunté à l'excellent article ici: [[http://www.dalkescientific.com/writings/diary/archive/2005/04/20/tracing_python_code.html]]
 +
 +<code python>
 +import linecache
 +
 +def trace(self, frame, event, arg):
 +    if event=='line':
 +        lineno = frame.f_lineno
 +        filename = frame.f_globals["__file__"]
 +        if filename == "<stdin>":
 +            filename = "traceit.py"
 +        if (filename.endswith(".pyc") or
 +            filename.endswith(".pyo")):
 +            filename = filename[:-1]
 +        name = frame.f_globals["__name__"]
 +        line = linecache.getline(filename, lineno)
 +        print "%s:%s: %s" % (name, lineno, line.rstrip())
 +        if self.arretthread:
 +            raise ValueError ("Arrêt du thread demandé")
 +            # autre option possible: raise SystemExit()
 +    return self.trace
 +</code>
 +
 +Bien sûr, le "print" va écrire dans la console, même si le programme en exécution est en graphique avec tkinter.
 +
 +Par exemple, dans la méthode numéro 2, l'utilisation de cette option donnera les sorties console suivantes:
 +
 +<code python>
 +__main__:16:     i=1L
 +__main__:17:     while i<10000000000L:
 +__main__:18:         x=sqrt(i)
 +__main__:19:         i+=1
 +__main__:18:         x=sqrt(i)
 +__main__:19:         i+=1
 +....
 +__main__:18:         x=sqrt(i)
 +__main__:19:         i+=1
 +Arrêt du thread demandé
 +</code>
 +
 +<html>
 +<head>
 +<style type="text/css">
 +<!--
 +body {background-image:url(fondcorps.jpg);}
 +-->
 +</style>
 +</head>
 +<body>
 +</body>
 +</html>
  
  
arret_thread.txt · Dernière modification: 2008/04/12 08:45 de tyrtamos