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

Python Discussion :

Pb de threading en fonction de l'utilisation ou non de pyqt


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Par défaut Pb de threading en fonction de l'utilisation ou non de pyqt
    Bonjour à tous

    voila je fais une petite application qui peux s'utiliser soit en interface graphique (avec pyqt) soit en CLI.
    j'ai une fonction à threader: "MaFonction"

    Si j'utilise ma class via QThread -> class MaFonction(QThread):
    * dans le premier cas (GUI), j'initialise ma fenêtre X, puis je lance un thread "MaFonction" pour faire mes petites actions grâce a QThread, pas de problème.
    * dans le second cas (CLI), comme il n'y a pas de fenêtre Qt, le lancement du QThread est problématique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    line 26, in __init__
        super(TelechargerMegaupload,self).__init__(parent)
    TypeError: QThread(QObject parent=None): argument 1 has unexpected type 'instance'
     
    C:\Documents and Settings\Administrateur\Bureau\BotMU>python BotMU.py

    a l'inverse, si j'utilise threading.Thread -> class MaFonction(threading.Thread)
    * dans le premier cas, j'ai une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    QObject: Cannot create children for a parent that is in a different thread.
    (Parent is mainWidget(0x18fb690), parent's thread is QThread(0x188dcc8), current
     thread is QThread(0x1961e38)
    * dans le second, ça fonctionne (sans avoir poussé la chose)

    Donc:
    je suis obligé de faire deux classe différente MaFontion(threading.Thread) et MaFonction(QThread) ou y a t il une solution qui mettrai tt le monde d'accord ?

    Details important: mon Thread renvoie des informations a son parent toute les x secondes (via un SIGNAL en pyqt, ou via un appel direct (self.parent.fonction) dans le cas du thread.

    Merci

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Dans a peu près tous les cas, si vous dérivez "threads", c'est pour modifier le comportement d'un thread et pas seulement surcharger la méthode "run" avec une "activité".

    Personnellement, je pose "activité" = "callable" au sens méthode ou fonction qui en sera le point d'entrée et qui peut être appelé "normalement" - i.e. sans thread: c'est plus facile à tester "séparément" qu'englué dans...-.
    Et d'utiliser l'API proposée par threading: threading.Thread(target=callable, args=(...)...)

    Avec ce principe, vous pouvez exécuter "l'activité" avec n'importe quel modèle de threading: python threading, multiprocessing, ou Qt.
    Note: Qt étant C++ et C++ étant beaucoup plus typé que Python, difficile d'avoir une telle API, mais elle est facile à faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from PyQt4 import QtCore
     
    class MyQThread(QtCore.QThread):
        def __init__(self, target, args=None, kwds=None):
             assert callable(target)
             self._items = target, args, kwds
        def run():
             target, args, kwds = self._items
             try:
                   target(*args, **kwds)
             except:
                   pass
    Avec une telle règle, vous collez thread et l'activité en fonction des besoins et du module de threading "choisi" suivant votre environnement:
    • console: threading.Thread, QThreads
    • GUI: QThreads,


    Si vous souhaitez malgré tout utiliser QThread sans QApplication, il faut au moins initialiser les couches bases de Qt car:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> from PyQt4 import QtCore
    >>> t = QtCore.QThread()
    >>> t.start()
    >>> QEventLoop: Cannot be used without QApplication
    >>> # donc...
    >>> a = QtCore.QCoreApplication([])
    >>> t.start()
    Bon courage,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [WD11] Thread et fonctions de dessin
    Par hegros dans le forum WinDev
    Réponses: 5
    Dernier message: 26/03/2007, 16h11
  2. Associer un thread à une fonction
    Par cris73 dans le forum Prolog
    Réponses: 1
    Dernier message: 10/03/2007, 10h17
  3. Problème thread et fonction récursive
    Par cryptorchild dans le forum Langage
    Réponses: 3
    Dernier message: 27/09/2006, 12h19
  4. Réponses: 1
    Dernier message: 09/05/2006, 20h01
  5. Réponses: 5
    Dernier message: 16/12/2005, 17h41

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