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 :

Communication entre QThread [QThread]


Sujet :

Multithreading

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 43
    Points : 35
    Points
    35
    Par défaut Communication entre QThread
    Bonjour, voilà 1 semaine que je m'arrache les cheveux sur un problème.

    J'ai crée deux classes (CThreadServeur et CThreadMesures) qui hérite de QThread, la classe CThreadServeur possède une QUdpSocket et réceptionne parfaitement les messages du client (avec des indormations en QString), ce thread à pour but de dire à CThreadMesures en lui passant des paramètres de type QString lance la mesure ou arrête la mesure.

    J'ai une fonction acquisition(Qstring param) qui s'execute dans CThreadMesures.

    Je ne sais pas comment faire communiquer les deux CThread de façon cohérente et surtout comment donnée l'ordre de stopper les mesures.

    J'ai éssayé plusieurs choses et lu des centaines de forum mais impossible de trouver une solution.

    Quelqu'un aurait-il une idée?
    Merci.

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 605
    Points
    188 605
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 43
    Points : 35
    Points
    35
    Par défaut
    Oui c'est évident lorsqu'on choisit Qt mais mon problème c'est que une fois rentré dans ma boucle de mesures avec un signal/slot, plus aucun slot ne fonctionne après, j'ai bien esseyé d'utiliser des variables global mais rien à faire.

    Je continue de chercher une solution.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par 0inm3 Voir le message
    c'est que une fois rentré dans ma boucle de mesures avec un signal/slot, plus aucun slot ne fonctionne après,
    Si tu fait une boucle, ça bloque l'eventloop donc c'est normale....

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 43
    Points : 35
    Points
    35
    Par défaut
    Oui donc j'ai décidé d'utiliser une varialbe global avec un Qmutex pour que mon thread serveur la modifie à on ou off et le thread mesures la lit dans la boucle mais rien à faire même mise à off je continue de tourner dans mesures.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Sans code ou plus d'explication c'est très difficile de te répondre.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 43
    Points : 35
    Points
    35
    Par défaut
    Désolé, voici le fichier d'entête de 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #ifndef CTHREADS_H
    #define CTHREADS_H
     
    #include <QThread>
    #include <QMutex>
    #include "caccelerometre.h"
    #include "carchiveur.h"
    #include "cgps.h"
    #include "cserveur.h"
     
    enum Etat_t {MES_ON, MES_OFF};
     
    static QMutex mutex;
    static Etat_t etatMes;
     
    /*-----------------------------------------------
                      THREAD MESURES
    -----------------------------------------------*/
     
    class CThreadMesures : public QThread
    {
        Q_OBJECT
    public:
        explicit CThreadMesures(QObject *parent = 0);
        ~CThreadMesures();
    signals:
        void mesures(QString _donnees);
    public slots:
        void analyse(QString _nom, QString _prenom);
    protected:
        void run();
    protected:
        CAccelerometre modAcc;
        CGps modGps;
        CArchiveur archiveur;
    };
     
    /*-----------------------------------------------
                     THREAD SERVEUR
    -----------------------------------------------*/
     
    class CThreadServeur : public QThread
    {
        Q_OBJECT
    public:
        explicit CThreadServeur(QObject *parent = 0);
        ~CThreadServeur();
    signals:
    public slots:
    protected:
        void run();
        CServeur *ptrServeurUdp;
    };
    #endif // CTHREADS_H
    ptrServeurUdp émet un signal avec des paramètres si le client lui envoi le message qu'il faut.
    Le problème c'est que je relève des valeurs et c'est le client qui envoi un second message (impossible de savoir à quel moment) pour lui dire de stopper les mesures.
    Donc dans le slot analyse() j'ai une boucle qui effectue des mesures en permanence.

    J'espère avoir clarifié les choses.

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Attention, le slot d'un QTHread ne s'éxécute pas dans le thread.
    http://qt.developpez.com/faq/?page=T...tenance-thread

    TU doit pouvoir faire plus simple :
    1- hérite ed QObject et non de QThread
    2- instancie 2 QThread et lance les (start)
    3- associe tes QObject avec un des QThread avec moveToThread

    Déjà tu aura les slot qui s'éxécuterons dans le bon thread.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 43
    Points : 35
    Points
    35
    Par défaut
    Je ne comprend pas bien ce que tu veux dire, mes deux classes devraient hériter de QObject puis dans le main j'instancie deux QThread? Et mes classes dans tout sa à quel moment je les instancie?

    remarque : Il faut dans chaque constructeur un moveToThread(this), mais this fait référence à quoi? à ma classe?


    edit : Après lecture je comprend un peu mieu ce que tu veux dire mes comment associer un QThread avec un de mes QObject.

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par 0inm3 Voir le message
    Après lecture je comprend un peu mieu ce que tu veux dire mes comment associer un QThread avec un de mes QObject.
    C'est le contraire, tu associe ton QObject à une instance de QThread avec moveToThread

  11. #11
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 43
    Points : 35
    Points
    35
    Par défaut
    Mais à quel moment et surtout comment je peux associé un QObject à un QThread.
    Dans le main()?

    Si tu pouvais me montrer un petit exemple avec une classe et un main très basique sa m'aiderais.

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut

    Ben ou tu veux... Je ne comprend pas ce qui te manque

  13. #13
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 43
    Points : 35
    Points
    35
    Par défaut
    Et bien en faite lors du moveToThread je ne comprend pas à quel Thread tu seras associé mon QObject.

    D'après ce que j'ai compris j'ai besoin d'une classe serveur et d'une classe mesures qui héritent de QObject et il faut que je crée deux thread (mes propres threads qui héritent de QThread) et que j'associe chaque objet à chaque thread?

  14. #14
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par 0inm3 Voir le message
    il faut que je crée deux thread (mes propres threads qui héritent de QThread)
    tu utilise directement des QThread sans héritage
    C'est en cours de finalization mais ca pourrai t'aider : http://yan-verdavaine.developpez.com...t_movetothread

  15. #15
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 43
    Points : 35
    Points
    35
    Par défaut
    Merci pour ton aide je devrais réussir maintenant.

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

Discussions similaires

  1. [QThread] [Prise de tête] Communication entre 2 QThread
    Par TiteFlora dans le forum Multithreading
    Réponses: 2
    Dernier message: 12/04/2010, 13h24
  2. Lecture standard et communication entre processus!
    Par Tartar Ukid dans le forum C++Builder
    Réponses: 5
    Dernier message: 05/07/2003, 16h37
  3. Communication entre processus
    Par markopolo dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/06/2003, 16h21
  4. Réponses: 5
    Dernier message: 25/03/2003, 19h43
  5. communication entre programmes
    Par jérôme dans le forum C
    Réponses: 12
    Dernier message: 16/04/2002, 08h05

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