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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    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 confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    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.

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    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 confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    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.

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    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