Rechercher : dans
Par :

[python]stop threading.timer

Dernière réponse le 24 nov 2006 à 21:33:33 teebo, le 24 nov 2006 à 07:45:45 
 Signaler ce message aux modérateurs

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...
Sans la politesse, on ne se réunirait que pour se battre.
Il faut donc ou vivre seul ou être poli.

Alphonse Karr

Meilleures réponses pour « [python]stop threading.timer » dans :
Votre première application graphique avec Python et Glade VoirCe guide vous aidera à créer pas à pas votre première application graphique. Nous allons utiliser le langage de programme Python et l'API graphique GTK, en utilisant le logiciel Glade pour créer facilement les interfaces graphiques. C'est de la...
[Python] Lire et écrire des fichiers CSV VoirLIRE ET ÉCRIRE DES FICHIERS CSV Python www.python.org, dans sa version 2.4 supporte de facto le format CSV (comma-separated values: valeurs séparées par des virgules). La Library Reference est certes très explicative à ce sujet, mais uniquement...
VBA Un timer une seconde tout simple VoirEn VBA, il n'y a pas (du moins à ma connaissance) de composant Timer. On peut en créer un très facilement. Dans un module de feuille Activer/ dés activer le timer : Placer un bouton sur Feuil1 et mettre le code... Private Sub...

1

sebsauvage, le 24 nov 2006 à 09:41:01

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).
“Life is short - You need Python” -- Bruce Eckel, membre du comité ANSI C++

Répondre à sebsauvage

2

teebo, le 24 nov 2006 à 10:28:41

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
Sans la politesse, on ne se réunirait que pour se battre.
Il faut donc ou vivre seul ou être poli.

Alphonse Karr

Répondre à teebo

3

sebsauvage, le 24 nov 2006 à 10:46:33

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.
http://docs.python.org/lib/module-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.
“Life is short - You need Python” -- Bruce Eckel, membre du comité ANSI C++

Répondre à sebsauvage

4

teebo, le 24 nov 2006 à 10:50:33

D'accord, merci...
Tu n'utilises pas un debugger non plus...
Sans la politesse, on ne se réunirait que pour se battre.
Il faut donc ou vivre seul ou être poli.

Alphonse Karr

Répondre à teebo

5

sebsauvage, le 24 nov 2006 à 10:56:12

Non pas de debugger.
“Life is short - You need Python” -- Bruce Eckel, membre du comité ANSI C++

Répondre à sebsauvage

6

 Obeet, le 24 nov 2006 à 21:33: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! C'est vieux comme le monde la nouveauté...
Prévert

Répondre à Obeet