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

Multithreading Discussion :

QThread et la GUI


Sujet :

Multithreading

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Par défaut QThread et la GUI
    Je développe un analyseur en traitement du signal (pour le son et l'image dans le cinéma).

    J'ai donc une GUI très simple, dont un pushButton lance une analyse, l'utilisateur en est informé par une QProgressDialog qui s'affiche et s'actualise de facon parfaitement classique.

    Pour des questions de commodités, j'ai déporté l'analyse dans un QThread::run()...
    Ca me permet de continuer d'utiliser des fonctions de la GUI principale : comme consulter des valeurs, écouter et visualiser les médias traités.

    Au final :
    * l'analyse (et écritures éventuelles) se font dans la classe dérivée de QThread,
    * la consultation (pure lecture de données) se fait dans la GUI
    NB : la GUI ne dérive pas (en tant que QObject) de QThread (sur conseils récurrents des forums et pour préserver le thread d'affichage).


    Mon problème :

    * le thread ne fonctionne que la première fois,
    * parfois l'affichage de la GUI principale, ou de la QProgressDialog se retourne (symétrie horizontale) ou alors les éléments graphiques sont déplacées sans logique apparente. Le debug pointe alors souvent sur QMacStyle::... ou des classes non présentes dans la QtDoc.


    Savez vous pourquoi ces horreurs graphiques ?
    Ai je un soucis avec le thread de rafraichissement graphique ?

    Thanks for help.

    Ps : des images très vite.

  2. #2
    Membre éclairé Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Par défaut
    Chose non négligeable :

    Pour accélerer mon déport vers un thread, je passe à ma QThread l'adresse de son appelant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class monThread : public QThread {
    private:
    MotherGUI* m_caller;
     
    public:
    monThread::run() {
     m_caller->analyse();
    }
     
    }

  3. #3
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Salut,

    Ce n'est pas le code d'analyse qui se trouve dans ton thread ?? Faut voir ce que la méthode MotherGUI::analyse() fait, mais ça me semble assez risqué puisque tu (ou la personne qui maintiendra le code derrière toi) seras sans doute tenter d'y intercaler des appels graphiques ou autres manips non threadsafe.

  4. #4
    Membre éclairé Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Par défaut
    disons que c'est effectivmt le code de l'analyse qui est dans le thread.

    Mais dans ce code il y a des appelles à des variables et de méthodes de l'interface, ce qui n'est cohérent que du point du vue de l'historique du projet.

    Et deuxièmement dans le run() du thread, il y a bien des appels graphiques (sic)

  5. #5
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Bah t'as ta réponse alors; dans le run, appeler une méthode ne suffit pas pour faire du MT sans toucher à la GUI. Faut séparer l'algo du feedback; ensuite par les signaux/slots inter-threads, tu peux connecter des étapes de l'algo à l'interface.

  6. #6
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    Citation Envoyé par ttone
    Chose non négligeable :

    Pour accélerer mon déport vers un thread, je passe à ma QThread l'adresse de son appelant :
    Code :

    class monThread : public QThread {
    private:
    MotherGUI* m_caller;

    public:
    monThread::run() {
    m_caller->analyse();
    }

    }
    A mon avis cela est très dangereux et le code sera peu maintenable et le traitement difficilement réutilisable.

    Pour que tout se passe bien il faut que tu crées un tread tu mets tout ton traitement dedans en n'oublie pas la communication avec la GUI avec des signaux/slots. Puis tu fais appartenir ton thread a ta GUI et comme ça tu gère la création et le lancement du thread a partir de la GUI.

    Bon courage et meme si tu as un peu de temps a passé pour remettre en forme ton code, je ne pense pas cela soit du temps de perdu.

    Bon courage.
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

Discussions similaires

  1. [Info]gui builder
    Par sonialem2000 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 03/08/2004, 21h13
  2. Quelle lib pour vos GUI?
    Par mandale dans le forum Choisir un environnement de développement
    Réponses: 5
    Dernier message: 03/08/2004, 17h58
  3. [Débutante] GUI Postgresql
    Par aidefz dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 07/04/2004, 10h49
  4. [editeur GUI][info]
    Par lunatix dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 26/01/2004, 15h59
  5. [GUI] Ou trouver les standard ?
    Par Braim dans le forum Windows
    Réponses: 5
    Dernier message: 01/10/2003, 08h13

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