Qt5 + CMake + QThread : le signal de la classe de base abstraite n'est pas connecté à l'emplacement d'un autre thread

J'ai implémenté une hiérarchie de classes pour gérer l'interaction des capteurs de manière multithread QThread, comme cela est recommandé dans la documentation Qt. Ici, j'ai le fichier d'en-tête types.havec la classe de lecteur de capteur de base abstraite :

#include <QtCore>
class QAbstractSensorReader: public QObject
{ Q_OBJECT
protected slots:
virtual void ReadData() = 0;
public slots:
virtual void RunPoll() = 0;
signals:
void acquired();
};

Dans le fichier serial.himplémentant le lecteur de capteur réel, j'ai le texte suivant :

#include "types.h"
class QBaseSerialSensorReader: public QAbstractSensorReader
{
Q_OBJECT
private:
/*===*/
protected:
QTextStream ttyout;
QTimer* poll_timer;
virtual void ReadData();
public:
QBaseSerialSensorReader(const QString device);
virtual ~QBaseSerialSensorReader();
virtual void RunPoll();
};

Le signal acquired()est émis dans le ReadData()gestionnaire lorsque le paquet de données est complètement assemblé lors de l'interrogation du capteur. L'emplacement RunPoll()est utilisé pour initialiser et démarrer une minuterie. Puis j'ai implémenté la classe controller:

#include "serial.h"
class QSensor: public QObject
{
Q_OBJECT
private:
QThread reader_thread;
QBaseSerialSensorReader* reader;
public:
QSensor()
{
reader = new QBaseSerialSensorReader();
reader->moveToThread(&reader_thread);
connect(&reader_thread, &QThread::finished, reader, &QObject::deleteLater);
connect(this, &QSensor::RunReader, reader, &QAbstractSensorReader::RunPoll);
connect(reader, &QBaseSerialSensorReader::acquired, this, &QSensor::Packet);
reader_thread.start();
}
void Start() {emit RunReader();}
virtual ~QSensor();
public slots:
void Packet(){ttyout << "ACQUIRED!";}
signals:
void RunReader();
};

Ensuite l'application:

#include "controller.h"
int main(int argc, char** args)
{
QCoreApplication app(argc, args);
QSensor sensor();
sensor.Start();
sleep(10);
return 0;
}

exploite la hiérarchie.

Le fichier CMake contient le texte suivant :

find_package(Qt5 REQUIRED COMPONENTS Core SerialPort)
set(CMAKE_AUTOMOC ON)
qt5_wrap_cpp(MOC_SOURCES
include/types.h
include/serial.h
include/contoller.h
)
set(LIBRARY_SOURCES
${MOC_SOURCES}
src/util.cpp
src/serial.cpp
src/controller.cpp
)
add_library(sensor-serial SHARED ${LIBRARY_SOURCES})
target_link_libraries(sensor-serial Qt5::Core Qt5::SerialPort)
add_executable(library-init-test
tests/library-init-test.cpp
)
target_link_libraries(library-init-test
Qt5::Core Qt5::SerialPort
sensor-serial
)

Le problème est que le signal QSensor::RunReaderest correctement connecté au QAbstractSensorReader::RunPollslot: la fonction virtuelle QBaseSerialSensorReader::RunPoll()est appelée. La minuterie est également démarrée et la ReadData()fonction fonctionne en émettant le acquiredsignal. Mais ce signal ne semble alors pas être connecté au QSensor::Packet()slot ni depuis QAbstractSensorReaderni depuis l'espace de QBaseSerialSensorReadernoms.

Pourriez-vous s'il vous plaît essayer d'expliquer ce qui ne va pas avec ce code?


Solution du problème

Vous n'entrez pas dans la boucle d'événements d'application. Supprimez le sommeil de la fonction principale et appelez QCoreApplication::exec. C'est-à-dire remplacer ces lignes

sleep(10);
return 0;

avec

return app.exec();

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"