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 :

exec() d'un QThread fini mais vivant


Sujet :

Multithreading

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Points : 10
    Points
    10
    Par défaut exec() d'un QThread fini mais vivant
    Bonjour,

    Je m'essaie à l'utilisation des QThread pour une lecture asynchrone de liaison série, et il y a une chose que j'ai du mal à comprendre concernant la boucle événementielle d'objets appartenant à un thread qui a terminé son éxécution (mais non détruit).

    Pour décrire mon exemple:
    Je souhaite en gros que les lectures du buffer d'entrée de la liaison RS232 se fassent dans un thread autre que le "main thread".
    J'ai donc écrit une classe MaGestionDePortSerie héritée de QObject:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    classe MaGestionDePortSerie : public QObject
    elle implémente une fonction de lecture du port série quand l'un de ses membres de type QSerialPort lui envoie un signal readyRead():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect(m_pSerialPort, SIGNAL(readyRead()), this, SLOT(readData()));
    Dans le thread principal, je crée une instance de MaGestionDePortSerie, et je le MoveToThread vers mon thread.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    QThread* pRs232Thread = new QThread();
    QObject::connect(pRs232Thread, SIGNAL(started()), &m_instanceDeMaGestionDePortSerie, SLOT(process()));
    m_instanceDeMaGestionDePortSerie.moveToThread(pRs232Thread);
    pRs232Thread->start(QThread::NormalPriority);
    à noter que m_instanceDeMaGestionDePortSerie n'est pas déclaré sur la pile, car c'est un membre d'une classe instanciée dans la main() de mon programme, et qu'elle vit donc jusqu'à la fin du programme.

    MaGestionDePortSerie::process() est une méthode qui ouvre mon port série après l'avoir configuré, et appelle la fameuse ligne donnée précédemment, avant de faire un return (enfin bref, on sort de cette méthode après avoir fait le taf'):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect(m_pSerialPort, SIGNAL(readyRead()), this, SLOT(readData()));
    J'ai beau recevoir des données sur ma liaison série, mon slot MaGestionDePortSerie::readData() n'est jamais appelé.

    D'où ma question:
    l'instantiation d'un QObject suffit-elle à garantir que sa boucle de gestion des signaux/slots sera exécutée?

    En gros: comme mon thread a fini son boulot quand la méthode MaGestionDePortSerie::process() se termine, les connections signaux/slots crées dans ce thread sont elles encore scrutées?
    Si oui => cool, mais il va falloir que je cherche encore d'où vient mon problème
    Si non => comment garantir une exécution continue de la boucle événementielle du thread, alors que le thread a terminé son exécution propre (car je ne veux pas passer par une boucle infinie pour le faire vivre plus longtemps).


    Merci d'avance à ceux qui prendront le temps de m'aider à comprendre...

    Nicolas

  2. #2
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Je ne suis pas expert sur les QThreads, mais de ce que je vois de ton code ton pRs232Thread ne devrais pas se terminer car le code par défaut du run d'un QThread est QThread::exec() qui lance une boucle d'évènements et ne se termine pas tant qu'on n'a pas appelé QThread::exit(..) ou QThread::quit(). Il va donc à priori continuer de tourner, et de gérer les signaux/slots. Ta "boucle infinie" est implicitement déjà existante sous la forme d'une boucle d'évènements Qt, et c'est la bonne façon de faire.

    Tu crées pRs232Thread mais tu ne le détruis jamais donc ? Tu devrais en faire un attribut de ta classe et forcer un quit + delete dans le destructeur.

    Je ne vois pas pourquoi ton slot readData n'est pas appelé. Tu as vérifié que les connexions se passaient bien ? (tu dois avoir des erreur en console à l'exécution quand un connect échoue, sinon tu peux aussi tester le retour de la fonction)
    Est ce que m_pSerialPort est un enfant de m_instanceDeMaGestionDePortSerie ? La fonction moveToThread change l'objet de thread ainsi que tous ses enfants, si m_pSerialPort n'en est pas un ses signaux seront émis depuis ton thread principal il me semble (ce qui n'est pas un problème en soi je pense)

Discussions similaires

  1. 2048 bientôt fini, mais problème d'écouteurs
    Par gulux56 dans le forum EDT/SwingWorker
    Réponses: 3
    Dernier message: 30/04/2014, 15h51
  2. Projet fini mais certains utilisateurs ne peuvent l'ouvrir
    Par Benduroy dans le forum Général Java
    Réponses: 5
    Dernier message: 03/12/2011, 18h02
  3. Un exec() qui n'en fini plus de charger
    Par Elyadohr dans le forum Langage
    Réponses: 2
    Dernier message: 05/08/2010, 21h31
  4. [JAR exec][AboluteLayout] Mais où te caches-tu ?
    Par NeptuS dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 12/09/2005, 15h51
  5. [Process] pb exec sous unix, ne plante pas mais ne fait rien
    Par NiBicUs dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 10/12/2004, 05h27

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