[python]stop threading.timer

Résolu
teebo Messages postés 33570 Statut Modérateur -  
Obeet Messages postés 1766 Statut Modérateur -
Salut tout le monde,
J'utilise des timers dans mon application (threading.timer), quand l'application (wxWidget) se ferme, je fais un .cancel() sur ces timers, mais ils continuent de vivre jusqu'à la fin de leur compte à rebours (ce qui peut durer plusieurs minutes). Pendant ce temps là, la fenêtre de l'appli est bien fermée mais l'application tourne encore.
Qu'est ce que je pourrai faire pour les "tuer" définitivement?
A moins qu'il faille arrêter l'application wx.App et pas seulement la fenêtre mais je croyais que c'était censé être automatique.

Merci ...
PS: Python2.4, pas essayé avec 2.5...

6 réponses

sebsauvage Messages postés 33415 Statut Modérateur 15 663
 
J'ai ce même de problème avec webGobbler (avec des threads qui font des accès réseau).
Et le comportement de mon appli est le même: ma fenêtre disparaît, et j'ai l'appli qui reste encore un peu le temps que les connexions réseau tombent en timeout.

J'ai fait de nombreuses recherches sur internet: Il semble qu'il n'est pas possible, en Python, de tuer un thread.

Je te conseillerais de développer toi-même une classe thread timer que tu puisse canceller à volonté
(Dans webGobbler, j'utilise un objet Queue (thread-safe) pour communiquer entre mes threads: Pour demander à un thread de s'arrêter, je dépose un objet "Stop" dans sa Queue ; Chaque thread vient lire sa Queue régulièrement (1 fois par seconde).
Tu pourrais utiliser ce genre de méthode pour créer un timer qu'on peut canceller.)


Un autre solution peut-être un peu plus bourrin serait d'envoyer un signal à ton application (genre kill). (à tester).
0
teebo Messages postés 33570 Statut Modérateur 1 793
 
J'aurai pensé quand même que le cancel faisait ce genre de chose... :-/

J'ai aussi essayé le ExitMainLoop mais ça ne marche pas mieux...
Le problème du signal c'est qu'il est pas forcément multi-plateforme. Théoriquement à ce moment là je peux me permettre d'être bourrin (tout est arrêter proprement, sauf ces timers à la con...)

Dis tu debug avec quel outil toi? Parce que là j'en suis toujours à debugger avec des prints.

Merci
0
sebsauvage Messages postés 33415 Statut Modérateur 15 663
 
J'utilise le module logging, et chaque message émis par un thread contient l'identifiant du thread.
Comme ça je vois qui fait quoi, qui envoie un message à qui, etc.
https://docs.python.org/3/library/logging.html

(instancié dans le main):
...
handler.setFormatter(logging.Formatter('[%(thread)d] %(name)s: %(message)s'))
logging.getLogger().addHandler(handler)
...


Ensuite je l'utilise dans chaque classe dérivant de threading:
logging.getLogger(self.name).info(message)
(on pourrait aussi utiliser self.__class__ pour obtenir le nom de la classe)

Ce qui me donne des logs du genre:
[2448] collector_yahooimagesearch: http://www.pearl-of-wisdom.com/images/toy4.jpg
[3088] collector_flickr: Querying 'toy toys'
[2312] collector_googleimages: http://www.germes-online.com/direct/dbimage/50215787/Toy_Car.jpg
[2312] collector_googleimages: Querying 'toy toys'
[2232] collector_askjeevesimages: Stopped
[2700] collector_deviantart: list index out of range
Traceback (most recent call last):
  File "webgobbler.py", line 1865, in run
  File "webgobbler.py", line 2114, in _getRandomImage
  File "C:\Python24\Lib\random.py", line 249, in choice
IndexError: list index out of range
[2700] collector_deviantart: Stopped
[2312] collector_googleimages: Stopped
[3088] collector_flickr: Stopped
[2448] collector_yahooimagesearch: Stopped
[2664] imagepool: Using images in C:\Program Files\webGobbler\imagepool
[2664] assembler_superpose: Starting from previous image.
[3796] assembler_superpose: Shutting down
[2688] imagepool: Shutting down
[2700] collector_deviantart: Shutting down.
[2312] collector_googleimages: Shutting down.
[2232] collector_askjeevesimages: Shutting down.
[2448] collector_yahooimagesearch: Shutting down.
[3088] collector_flickr: Shutting down.



Les numéros entre crochets sont les identifiants de thread.
0
teebo Messages postés 33570 Statut Modérateur 1 793
 
D'accord, merci...
Tu n'utilises pas un debugger non plus...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sebsauvage Messages postés 33415 Statut Modérateur 15 663
 
Non pas de debugger.
0
Obeet Messages postés 1766 Statut Modérateur 30
 
Mouarf, je suis con, en fait il fallait que je refoute n'importe quoi dans ma Queue histoire que les threads fasse une boucle jusqu'a arriver a mon test!
0