Je développe un petite appli python/gtk qui télécharge un fichier quand on clique sur un bouton. J'ai constaté que l'interface "freeze" quand on clique sur le bouton, jusqu'au moment où le fichier est downloadé. J'essaie donc de mettre en oeuvre plusieurs threads afin de ne pas bloquer l'interface principale quand je lance le téléchargement.
La méthode lancée par le bouton "télécharger" est la suivante :
def on_telecharger1_activate(self, widget, *args):
self.newthread1 = mcthread.ThreadDownload()
self.newthread1.start()
et la classe mcthread.ThreadDownload est la suivante :
class ThreadDownload(threading.Thread):
'''Classe de thread pour les downloads de fichiers'''
def __init__(self):
threading.Thread.__init__(self)
#on crée l'objet qui permet la connexion et le telechargement de fichiers
self.mvcov1 = moviecovers.Moviecovers()
print "thread cree"
Avec ce code, j'ai constaté que le thread est créé (enfin le message "thread cree" apparait dans la console), mais la méthode run n'est pas exécutée, sauf si par exemple on ferme la fenêtre... tout se passe comme si (als ob), la fonction run était mise en attente...
Si je remplace dans la méthode on_telecharger1_activate self.newthread1.start() par self.newthread1.run(), alors le multi-threading ne sert plus à rien car l'interface freeze à nouveau, en attendant que le fichier soit téléchargé... bref, je tourne en rond.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Christope Dutrieux
Le Tue, 01 Nov 2005 13:30:29 +0100, NonSenZ a écrit :
Bonjour à tous,
Je développe un petite appli python/gtk qui télécharge un fichier quand on clique sur un bouton. J'ai constaté que l'interface "freeze" quand on clique sur le bouton, jusqu'au moment où le fichier est downloadé. J'essaie donc de mettre en oeuvre plusieurs threads afin de ne pas bloquer l'interface principale quand je lance le téléchargement.
La méthode lancée par le bouton "télécharger" est la suivante : def on_telecharger1_activate(self, widget, *args): self.newthread1 = mcthread.ThreadDownload() self.newthread1.start()
et la classe mcthread.ThreadDownload est la suivante :
class ThreadDownload(threading.Thread): '''Classe de thread pour les downloads de fichiers'''
def __init__(self): threading.Thread.__init__(self) #on crée l'objet qui permet la connexion et le telechargement de fichiers self.mvcov1 = moviecovers.Moviecovers() print "thread cree"
Avec ce code, j'ai constaté que le thread est créé (enfin le message "thread cree" apparait dans la console), mais la méthode run n'est pas exécutée, sauf si par exemple on ferme la fenêtre... tout se passe comme si (als ob), la fonction run était mise en attente... Si je remplace dans la méthode on_telecharger1_activate self.newthread1.start() par self.newthread1.run(), alors le multi-threading ne sert plus à rien car l'interface freeze à nouveau, en attendant que le fichier soit téléchargé... bref, je tourne en rond.
Si quelqu'un voit où je fais l'erreur...
J'ai eu le même genre de soucis récemment lorsque je me suis mis aussi à Python et GTK. Aussi, je crois pouvoir dire que vous êtes : Windowzien de culture et sans doute développeur VB de souche :-))
Bref, mais là n'est pas la question, sans vouloir dire trop de c........, voici à la solution à laquelle je suis arrivé:
- seul mon thread principal manipule GTK - le thread secondaire (qui ici assure le transfert de fichiers) passe des infos au thread principal qui en assurera l'affichage. L'échange d'infos peu se faire via des classes/variables partagées (exemple : objet Queue) - j'utilise l'évenement gtk.timeout_add(ttt,self.XXXX) pour assurer la mise à jour de l'affichage de façon période
Il y a sans doute bien mieux à faire si on utilise les fonctions:
Le Tue, 01 Nov 2005 13:30:29 +0100, NonSenZ a écrit :
Bonjour à tous,
Je développe un petite appli python/gtk qui télécharge un fichier quand on clique sur un bouton. J'ai constaté que l'interface "freeze" quand on clique sur le bouton, jusqu'au moment où le fichier est downloadé. J'essaie donc de mettre en oeuvre plusieurs threads afin de ne pas bloquer l'interface principale quand je lance le téléchargement.
La méthode lancée par le bouton "télécharger" est la suivante :
def on_telecharger1_activate(self, widget, *args):
self.newthread1 = mcthread.ThreadDownload()
self.newthread1.start()
et la classe mcthread.ThreadDownload est la suivante :
class ThreadDownload(threading.Thread):
'''Classe de thread pour les downloads de fichiers'''
def __init__(self):
threading.Thread.__init__(self)
#on crée l'objet qui permet la connexion et le telechargement de fichiers
self.mvcov1 = moviecovers.Moviecovers()
print "thread cree"
Avec ce code, j'ai constaté que le thread est créé (enfin le message "thread cree" apparait dans la console), mais la méthode run n'est pas exécutée, sauf si par exemple on ferme la fenêtre... tout se passe comme si (als ob), la fonction run était mise en attente...
Si je remplace dans la méthode on_telecharger1_activate self.newthread1.start() par self.newthread1.run(), alors le multi-threading ne sert plus à rien car l'interface freeze à nouveau, en attendant que le fichier soit téléchargé... bref, je tourne en rond.
Si quelqu'un voit où je fais l'erreur...
J'ai eu le même genre de soucis récemment lorsque je me suis mis aussi
à Python et GTK. Aussi, je crois pouvoir dire que vous êtes :
Windowzien de culture et sans doute développeur VB de souche :-))
Bref, mais là n'est pas la question, sans vouloir dire trop de c........,
voici à la solution à laquelle je suis arrivé:
- seul mon thread principal manipule GTK
- le thread secondaire (qui ici assure le transfert de fichiers) passe des
infos au thread principal qui en assurera l'affichage. L'échange
d'infos peu se faire via des classes/variables partagées (exemple : objet
Queue)
- j'utilise l'évenement gtk.timeout_add(ttt,self.XXXX) pour assurer
la mise à jour de l'affichage de façon période
Il y a sans doute bien mieux à faire si on utilise les fonctions:
Le Tue, 01 Nov 2005 13:30:29 +0100, NonSenZ a écrit :
Bonjour à tous,
Je développe un petite appli python/gtk qui télécharge un fichier quand on clique sur un bouton. J'ai constaté que l'interface "freeze" quand on clique sur le bouton, jusqu'au moment où le fichier est downloadé. J'essaie donc de mettre en oeuvre plusieurs threads afin de ne pas bloquer l'interface principale quand je lance le téléchargement.
La méthode lancée par le bouton "télécharger" est la suivante : def on_telecharger1_activate(self, widget, *args): self.newthread1 = mcthread.ThreadDownload() self.newthread1.start()
et la classe mcthread.ThreadDownload est la suivante :
class ThreadDownload(threading.Thread): '''Classe de thread pour les downloads de fichiers'''
def __init__(self): threading.Thread.__init__(self) #on crée l'objet qui permet la connexion et le telechargement de fichiers self.mvcov1 = moviecovers.Moviecovers() print "thread cree"
Avec ce code, j'ai constaté que le thread est créé (enfin le message "thread cree" apparait dans la console), mais la méthode run n'est pas exécutée, sauf si par exemple on ferme la fenêtre... tout se passe comme si (als ob), la fonction run était mise en attente... Si je remplace dans la méthode on_telecharger1_activate self.newthread1.start() par self.newthread1.run(), alors le multi-threading ne sert plus à rien car l'interface freeze à nouveau, en attendant que le fichier soit téléchargé... bref, je tourne en rond.
Si quelqu'un voit où je fais l'erreur...
J'ai eu le même genre de soucis récemment lorsque je me suis mis aussi à Python et GTK. Aussi, je crois pouvoir dire que vous êtes : Windowzien de culture et sans doute développeur VB de souche :-))
Bref, mais là n'est pas la question, sans vouloir dire trop de c........, voici à la solution à laquelle je suis arrivé:
- seul mon thread principal manipule GTK - le thread secondaire (qui ici assure le transfert de fichiers) passe des infos au thread principal qui en assurera l'affichage. L'échange d'infos peu se faire via des classes/variables partagées (exemple : objet Queue) - j'utilise l'évenement gtk.timeout_add(ttt,self.XXXX) pour assurer la mise à jour de l'affichage de façon période
Il y a sans doute bien mieux à faire si on utilise les fonctions:
Le Thu, 03 Nov 2005 07:17:24 +0100, Christope Dutrieux a écrit :
J'ai eu le même genre de soucis récemment lorsque je me suis mis aussi à Python et GTK. Aussi, je crois pouvoir dire que vous êtes : Windowzien de culture et sans doute développeur VB de souche :-)) ---
A vrai dire pas du tout :-) Je connais un peu Linux, beaucoup mieux que windows en tous cas, et je ne suis pas développeur. Mes rares et maigres expériences de programmation se résument à Basic sur Oric Atmos, TO7 et MO5, Basic sur Amiga, PHP, Bash, Perl soux Linux, une très très brève initiation à Ruby, et je trouve Python vraiment adapté à ce que je recherche. Mon but est moins de réaliser un programme que d'apprendre à programmer correctement avec ce langage.
Je te remercie pour tes informations, ça me donne de nouvelles pistes que je vais explorer !
-- NSZ
Le Thu, 03 Nov 2005 07:17:24 +0100, Christope Dutrieux a écrit :
J'ai eu le même genre de soucis récemment lorsque je me suis mis aussi
à Python et GTK. Aussi, je crois pouvoir dire que vous êtes :
Windowzien de culture et sans doute développeur VB de souche :-))
---
A vrai dire pas du tout :-)
Je connais un peu Linux, beaucoup mieux que windows en tous cas, et je ne
suis pas développeur. Mes rares et maigres expériences de programmation
se résument à Basic sur Oric Atmos, TO7 et MO5, Basic sur Amiga, PHP,
Bash, Perl soux Linux, une très très brève initiation à Ruby, et je
trouve Python vraiment adapté à ce que je recherche. Mon but est moins
de réaliser un programme que d'apprendre à programmer correctement avec
ce langage.
Je te remercie pour tes informations, ça me donne de nouvelles pistes
que je vais explorer !
Le Thu, 03 Nov 2005 07:17:24 +0100, Christope Dutrieux a écrit :
J'ai eu le même genre de soucis récemment lorsque je me suis mis aussi à Python et GTK. Aussi, je crois pouvoir dire que vous êtes : Windowzien de culture et sans doute développeur VB de souche :-)) ---
A vrai dire pas du tout :-) Je connais un peu Linux, beaucoup mieux que windows en tous cas, et je ne suis pas développeur. Mes rares et maigres expériences de programmation se résument à Basic sur Oric Atmos, TO7 et MO5, Basic sur Amiga, PHP, Bash, Perl soux Linux, une très très brève initiation à Ruby, et je trouve Python vraiment adapté à ce que je recherche. Mon but est moins de réaliser un programme que d'apprendre à programmer correctement avec ce langage.
Je te remercie pour tes informations, ça me donne de nouvelles pistes que je vais explorer !