IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

Lancer plusieurs threads depuis un bouton


Sujet :

PyQt Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Points : 24
    Points
    24
    Par défaut Lancer plusieurs threads depuis un bouton
    Bonjour à tous ,

    voilà je cherche à lancer plusieurs threads en cliquant sur un bouton seulement je n'y arrive pas sans que cela ne crash l'application, je m'explique :
    Mon but est assez simple : je veux que lorsqu'un bouton est cliqué un thread contenant des actions "principales" à réaliser soit lancé mais également deux autres threads ( qui servent à mettre à jour les logs du programme ) simultanément seulement je n'y arrive d'aucune manière, avant toute chose voici la classe que j'utilise pour créer mes threads :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    class GenericThread(QtCore.QThread):
     
    	def __init__(self, function, *args, **kwargs):
    		QtCore.QThread.__init__(self)
    		self.function = function
    		self.args = args
    		self.kwargs = kwargs
     
            def __del__(self):
    		self.wait()
     
    	def run(self):
    		self.function(*self.args,**self.kwargs)
    		return
    Ensuite l'idée c'est de connecter mon fameux boutton à une fonction qui initialisera les 3 threads, mais quand je fais cela ça ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def launch_thread_principale(self):
           self.GenThread_action_principale = GenericThread(self.action_principale)
           self.GenThread_action_principale.start()
           self.GenThread_log_1 = GenericThread(self.init_log_1)
           self.GenThread_log_1.start()
           self.GenThread_log_2 = GenericThread(self.init_log_2)
           self.GenThread_log_2.start()
    Quand le bouton connecté a "launch_thread_principale" sera pressé, seul un thread ( le premier ) sera lancé ( si je me souviens bien car j'ai testé il y a une semaine ).
    Si en revanche je fais 3 fonctions ( une pour chaque thread ) et que je fais trois connections au bouton, quand je clique l'application crash.

    Merci d'avance !

    EDIT IMPORTANT : jai changer le code de ma classe de thread je l'avais pas posté en entier !!

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Si la "function" lancée par run contient des instructions graphiques: c'est ça.

    Les threads ne doivent pas contenir de telles instructions, mais ils peuvent envoyer des messages au programme principal pour que ces instructions soient exécutées.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Salut ^^,

    Ah, je comprends mieux merci bien pour l'explication, dans mon cas le log execute une sorte de "tail -f" sur un fichier de log et doit mettre a jour un QTextEdit.

    Si je ne peux pas faire la mise à jour du QTextEdit dans le thread comment le faire ailleurs ? Car j'avoue que je ne vois absolument pas comment faire un log dans ce cas .

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Quand il faut mettre à jour le QTextEdit, le thread envoie un message au programme principal (emit) qui, en le recevant (connect) lance une méthode qui met à jour le QTextEdit.

    Voir un exemple ici: http://python.jpvweb.com/mesrecettes..._fichier_pyqt4.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Merci beaucoup pour ces éclaircissements, je vais essayer de suite
    Ah et d'après ta signature il s'agit de ton site, j'en profite pour te dire beau boulot ! ---> dans les favoris

Discussions similaires

  1. Lancer plusieurs Thread exactement en même temps
    Par remax_ren dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 21/04/2009, 11h25
  2. Réponses: 2
    Dernier message: 16/02/2009, 15h21
  3. Lancer plusieur thread sur la meme fonction
    Par daviddu54 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 17/01/2008, 11h34
  4. lancer une fonction depuis un bouton
    Par olivnath dans le forum Tkinter
    Réponses: 2
    Dernier message: 30/05/2007, 10h16
  5. Réponses: 5
    Dernier message: 06/07/2006, 10h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo