[python]stop threading.timer

Résolu/Fermé
teebo Messages postés 33491 Date d'inscription jeudi 14 octobre 2004 Statut Modérateur Dernière intervention 24 février 2011 - 24 nov. 2006 à 07:45
Obeet Messages postés 1766 Date d'inscription jeudi 14 octobre 2004 Statut Modérateur Dernière intervention 17 novembre 2010 - 24 nov. 2006 à 21:33
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 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
24 nov. 2006 à 09:41
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 33491 Date d'inscription jeudi 14 octobre 2004 Statut Modérateur Dernière intervention 24 février 2011 1 793
24 nov. 2006 à 10:28
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 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
24 nov. 2006 à 10:46
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 33491 Date d'inscription jeudi 14 octobre 2004 Statut Modérateur Dernière intervention 24 février 2011 1 793
24 nov. 2006 à 10:50
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 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
24 nov. 2006 à 10:56
Non pas de debugger.
0
Obeet Messages postés 1766 Date d'inscription jeudi 14 octobre 2004 Statut Modérateur Dernière intervention 17 novembre 2010 30
24 nov. 2006 à 21:33
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