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 :

Multithreading et signaux/slots


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut Multithreading et signaux/slots
    Salut à tous,

    Je me remets doucement à Qt à l'aide de PyQt.

    J'essaie de déléguer du travail à un thread en arrière plan (je dérive de QThread et je réimplémente run()) et de déclencher un mise à jour de la GUI depuis ce thread de travail lorsqu'il a fini. Pour cela, dans ma méthode run(), je connecte mon signal à un slot de la classe parente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject.connect(self, SIGNAL("updateView()"), self.glWidget, SLOT("updating()"))
    L'objet self.glWidget a bien une méthode updating que je peux appeler en direct.
    De même, si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject.connect(self, SIGNAL("updateView()"), self.glWidget.updating)
    le slot est bien appelé, mais pas du bon thread (je le constate car il ya un problème OpenGL derrière).

    Je déclenche bien l'application puisque j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      app = QApplication(sys.argv)
      form = MainWindow()
      form.show()
      app.exec_()
    Si quelqu'un a déjà réussi à déméler l'écheveau PyQt, je lui en serai gré (déjà, je sais que PyQt est bien moins élégant que wxPython, qu'il y a bien plus de limitations au niveau signal/slot, ...)

  2. #2
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Ce comportement est tout à fait normal, le signal du thread est connecté au slot du widget, donc forcément ce dernier n'est pas appellé avec le même thread. Pour cela tu dois utiliser dans ton run() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    event = QEvent(QEvent.UpdateRequest)
    QCoreApplication.postEvent(self.glWidget, event)
    QCoreApplication.processEvents()
    Ce qui va mettre en oeuvre l'event queue de l'application et donc être thread-safe.

Discussions similaires

  1. Signaux & Slots deffaillants / Conseil Effets
    Par secksy dans le forum Débuter
    Réponses: 37
    Dernier message: 10/01/2009, 13h07
  2. Qt4 Signaux/slots personnels et Code::Blocks
    Par crtx_omar dans le forum Qt
    Réponses: 11
    Dernier message: 30/03/2008, 15h05
  3. Signaux / slots
    Par yoloosis dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 05/03/2008, 15h58

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