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:
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():
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.
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'):
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
Partager