[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 mercredi 13 octobre 2004 Statut Modérateur Dernière intervention 17 novembre 2010 - 24 nov. 2006 à 21:33
Obeet Messages postés 1766 Date d'inscription mercredi 13 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...
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 662
24 nov. 2006 à 09:41
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).
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).
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
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
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
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 662
24 nov. 2006 à 10:46
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:
Les numéros entre crochets sont les identifiants de 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.
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
24 nov. 2006 à 10:50
D'accord, merci...
Tu n'utilises pas un debugger non plus...
Tu n'utilises pas un debugger non plus...
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 662
24 nov. 2006 à 10:56
24 nov. 2006 à 10:56
Non pas de debugger.
Obeet
Messages postés
1766
Date d'inscription
mercredi 13 octobre 2004
Statut
Modérateur
Dernière intervention
17 novembre 2010
30
24 nov. 2006 à 21:33
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!