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 :

[Thread] Signal/Slot et Thread


Sujet :

Multithreading

  1. #41
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par ttone Voir le message

    Je voulais dire, est ce que je peux faire de ma classe "GUI", celle qui implèmente l'interface graphique, une QThread, et éviter de passer ainsi par une autre classe QThread...

    J'ai lu que c'était peu souhaitable.
    tu peut mais je ne trouve pas ca trés objet et trés propre. QThread n'est pas une clas GUI et faire un héritage multiple avecun QThread et un QWidget.... bof bof bof
    Pourquoi vouloir faire ca?

  2. #42
    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
    je ne trouve pas ca trés objet et trés propre
    c'est clair, j'essaie de trouver une bonne approche, pour clarifier un peu la mise en place des mutexs si besoin est.

    Et surtout pour minimaliser et trouver mon erreur.

    Enfin bref, du coup au lieu de créer une QThread "Media", j'ai tout passé dans ma classe principale. Ca évite les public, etc.
    Je gagne en nombre de méthode, variable qui se répétait, etc...
    et ca ne change pas grand chose en conception.
    Disons que la gestion media passe dans la GUI même.
    Et pour celle là paradoxalement je n'ai pas besoin de QThread.

    Je mets en place la QThread uniquement pour le timer.

    Et je verrai ce que ca donne.

    Ca va se résumer à un run qui contient un emit.
    Ca devrait finir par fonctionner...

  3. #43
    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
    faire un héritage multiple avecun QThread et un QWidget

    En effet, j'oublie tout de suite l'idée.

  4. #44
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par ttone Voir le message
    c'est clair, j'essaie de trouver une bonne approche, pour clarifier un peu la mise en place des mutexs si besoin est.

    Et surtout pour minimaliser et trouver mon erreur.

    Enfin bref, du coup au lieu de créer une QThread "Media", j'ai tout passé dans ma classe principale. Ca évite les public, etc.
    Je mets en place la QThread uniquement pour le timer.

    Et je verrai ce que ca donne.

    Ca va se résumer à un run qui contient un emit.
    Ca devrait finir par fonctionner...
    Je suis perdu...
    Peut tu me redire ce que doit faire ton thread??
    Quel est ton erreur?

  5. #45
    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
    Non, tu ne peux pas mettre la GUI dans un autre thread. Et tout mettre dans la classe principale, c'est plus que déconseillé. Se retrouver avec une grosse classe monolithique sans le moindre rôle exact est une horreur à retoucher (je l'ai fait aussi par le passé et je te recommande vivement de réfléchir à une conception plus propre du style 1 classe <=> 1 responsabilité).

  6. #46
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    La conception "type" dans ce genre de situation est comme l'a dit IrmatDen de confier à une classe une responsabilité.

    Plus tu divises en morceaux la fonction principale de ton programme, plus facile ce sera de rajouter des fonctionnalités, modifier ce qui existe, etc...
    Ici, tu dois séparer tout ce qui concerne ton thread du GUI, et les relier grâce au fabuleux système de signal-slot de Qt. Ils ne doivent rien partager d'autre.

  7. #47
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void SoundSystem::run()
    {
    	this->play(5000);
     
    	emit renderPosition(7);
     
     
    }
    ????
    ou est la boucle ????????
    quand tu fera start, un thread sera créé, puis ces deux ligne seront appélé puis ta thread sera fini!!!!!

    faut au moins une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void SoundSystem::run()
    {
       while(aze)
       {
    	...
       }
    }
    Et si tu veut utiliser l'eventloop tu doit la lancer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void SoundSystem::run()
    {
     
    	...
       exec();
    }

  8. #48
    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
    ????
    ou est la boucle ????????
    quand tu fera start, un thread sera créé, puis ces deux ligne seront appélé puis ta thread sera fini!!!!!
    Attends, avec ou sans boucle meme résultat : que dalle.
    La loop est prévu au programme final...

    Et si tu veut utiliser l'eventloop tu doit la lancer
    C'est quoi concrètement la différence entre eventloop et thread lancé par le run ? Le run lance un thread qui lance une eventloop qui effectue le contenu du run ?

  9. #49
    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
    La conception "type" dans ce genre de situation est comme l'a dit IrmatDen de confier à une classe une responsabilité.
    C'est sûr.

  10. #50
    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
    Citation Envoyé par ttone Voir le message
    Attends, avec ou sans boucle meme résultat : que dalle.
    La loop est prévu au programme final...

    C'est quoi concrètement la différence entre eventloop et thread lancé par le run ? Le run lance un thread qui lance une eventloop qui effectue le contenu du run ?
    Je ne comprends pas pourquoi vous vous échiner à vouloir mettre une boucle d'événement dans le thread? Quels événements de Qt as-tu à gérer dans le thread? J'ai cru comprendre que c'était un thread pour utiliser FModEx et émettre des infos. C'est tout ou y'a autre chose?

    (Note: je n'étais pas là pdt quelques jours, et je suis arrivé avec déjà 3 pages de posts, donc j'ai peut-être raté quelque chose)

  11. #51
    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
    Ok, bon résultat, je reviens à mon truc, une GUI, un Sound System, qui contient un run magnifique,

    dans ce run un while, et dans ce while un emit, et dans cet emit une variable, fixée à const int 10 pour les besoins du test

    Le emit ne fait pas frétiller le SLOT de la GUI d'un poil

    et d'ailleurs, aux derniers tests, c'est le SLOT qui est mauvais...

    Pourtant, ... il est bien déclaré dans les private slots,
    il prend bien les mêmes arguments.
    Il est même du même type.



    Y a t il une différence de déclaration notable pour les CONNECT, entre un signal émis depuis une QThread et un signal émi depuis son THREAD ?

    :

  12. #52
    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
    Peux-tu coller ici la déclaration + implémentation du thread, la déclaration de la classe contenant le slot, son implé, ainsi que la fonction/classe où le connect est fait?
    Ton archive faisant 8MB avec un débit de 50kB, ce sera plus pratique de n'avoir que l'essentiel

    Pour ta question, c'est pas vraiment clair. As-tu lu ceci: Signals and Slots Across Threads ?

  13. #53
    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
    Pour ta question, c'est pas vraiment clair. As-tu lu ceci: Signals and Slots Across Threads ?
    Oui je l'ai lu, je suis en queued connection, et dans le même cas de figure que l'exemple Mandelbrot.

    Peux-tu coller ici la déclaration + implémentation du thread,
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #ifndef SOUNDSYSTEM_H
    #define SOUNDSYSTEM_H
     
    #include <QMutex>
    #include <QSize>
    #include <QThread>
    #include <QWaitCondition>
     
    class SoundSystem : public QThread
     {
         Q_OBJECT
     
    public:
        SoundSystem(QObject *parent = 0);
    	~SoundSystem();
    protected:
    void run();
     
    private:
    bool timecount;
     
    signals:
       	void renderPosition(unsigned int position);
     };
    #endif
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include "SoundSystem.h"
    #include <QtGui>
    #include <fstream>
    #include <iostream>
    #include <QKeyEvent>
     
    using namespace std;
     
    SoundSystem::SoundSystem(QObject *parent)
    : QThread(parent)
    {
    	timecount=true;
    };
     
    SoundSystem::~SoundSystem(){
     
    };
     
    void SoundSystem::run()
    {
     
    	while(timecount){
    		emit renderPosition(7);
    		sleep(1);
    	}
     
     
    }
    la déclaration de la classe contenant le slot
    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
    16
    17
    18
    19
    20
    21
    22
    23
    #include "ui_GUI.h"
    #include "SoundSystem.h"
     
    using namespace std;
     
    class GUI : public QMainWindow
    {
    Q_OBJECT
     
    public:
        GUI(QWidget *parent = 0);
    	~GUI();
     
    private slots:
    	void rPosition(unsigned int position);
     
    private:
            Ui_GUI interface;
    	SoundSystem *audioThread;
     
    signals:
    	void renderPosition(unsigned int position);
    };
    son implé
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include "GUI.h"
    #include <stdio.h>
    #include <QtGui>
    #include <QtCore>
    #include <time.h>
    #include <string>
    #include <fstream>
    #include <iostream>
     
    using namespace std;
     
    GUI::GUI(QWidget *parent)
    : QMainWindow(parent)
    {
    	this->interface.setupUi(this);
    	audioThread = new SoundSystem(this);
    	Connect(audioThread, SIGNAL(renderPosition(unsigned int position)), this, SLOT(rPosition(unsigned int position)));
     
    };
     
     
    GUI::~GUI(){
    };
     
    void GUI::rPosition(unsigned int position){	
    	this->interface.transportSlider->setValue(77);
    	this->interface.timeLabel->setText(QString("544"));
    };
    , , ainsi que la fonction/classe où le connect est fait?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void GUI::rPosition(unsigned int position){	
    	this->interface.transportSlider->setValue(77);
    	this->interface.timeLabel->setText(QString("544"));
    };

  14. #54
    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
    Ah, ben voilou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Connect(audioThread, SIGNAL(renderPosition(unsigned int position)), this, SLOT(rPosition(unsigned int position)));
    1. connect s'écrit en minuscule
    2. les signaux/slots ne doivent comporter que les signatures, pas les noms de paramètres

    Et pour finir, tu ne démarres pas ton thread dans le snippet posté (à vérifier avec le reste de ton code bien sûr)

    PS: pas besoin de ; après l'implémentation des fonctions (ça ne fait rien de mal, mais c'est inutile)

  15. #55
    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
    connect s'écrit en minuscule
    erreur de frappe ici, c est en minuscule dans mon prog,
    j'ai donc passé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	connect(audioThread, SIGNAL(renderPosition(unsigned int)), this, SLOT(rPosition(unsigned int)));
    et ca marche...

    PS: pas besoin de ; après l'implémentation des fonctions (ça ne fait rien de mal, mais c'est inutile)
    c'est psychologique, quand je commence à tourner en rond, je met du verni "le point virgule"...


    merci

  16. #56
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par IrmatDen Voir le message
    Je ne comprends pas pourquoi vous vous échiner à vouloir mettre une boucle d'événement dans le thread?
    Ce n'etait pas une volonté. J'ai essayer de lui expliquer deux façon d'utiliser les thread avec Qt pour lui permettre de choisir celle qui lui correspond.
    Puis au bout d'un moment on mélange tout maintenant avec son code c'est plus claire

    Donc au final tu va y faire quoi dans le run??

  17. #57
    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
    donc au final... j'y lance la lecture, et le compteur.

    en fait je vais devoir créer une QThread pour le compteur, instanciée dans la QThread pour la lecture, instanciée dans la GUI


    Un truc bizarre pour le son, avec FMODex, ses méthodes ne sont plus asynchrones, une fois "play" lancée, la bande son est jouée... et on peut intervenir sur les canaux, le volume et tout.
    DANS LE MAIN THREAD

    Là j'ai calé "play", puis mon compteur, dans le run : le compteur marche mais play est zappé. Comme si il était asynchrone.

    Bref, je vais faire 2 threads.

    Le probleme que j'ai d'emblée, c'est le besoin de passer à mon run des variables venant de la classe d'audessus... puisque je vais dire à mon compteur : récupère la position de la tête de lecture à chaque pas...
    Hors la tête de lecture, elle est gérée par ma QThread qui "start" le compteur

  18. #58
    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
    Citation Envoyé par ttone Voir le message
    erreur de frappe ici, c est en minuscule dans mon prog,
    j'ai donc passé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	connect(audioThread, SIGNAL(renderPosition(unsigned int)), this, SLOT(rPosition(unsigned int)));
    et ca marche...
    C'est pour ça qu'en phase de debug, j'insiste et rappel et insiste encore pour que tout le monde utilise le mode console. Si tu utilises les fichiers pro, c'est tout simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CONFIG(debug, debug|release) {
    	CONFIG += console
    }

  19. #59
    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
    j'add de suite, j'avais ca dans mon .pro

  20. #60
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Pour cela, crée une classe qui hérite de QThread avec comme paramètres au constructeur les paramètres dont tu parles.

    Ensuite, tu n'as qu'à stocker une instance de cette classe dans ta classe de fenêtre principale, et connecter le run du thread au signal que tu veux (appui sur play, ...). Et dans le constructeur de ta classe fenêtre principale, ou dans une autre méthode, tu construis ton instance de thread dérivé en donnant les paramètres que tu désires au constructeur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Thread - Signal : Stop thread sur signal
    Par DaSiX dans le forum Général Python
    Réponses: 5
    Dernier message: 30/12/2014, 15h58
  2. Réponses: 8
    Dernier message: 22/05/2010, 11h50
  3. [TOMCAT] [THREAD] Ajout d'un thread à Tomcat
    Par olivangel dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 12/08/2004, 11h55
  4. [Thread] comment arreter un thread qui execute une methode b
    Par Cyber@l dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 04/08/2004, 10h51

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