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.h
avec 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.h
implé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::RunReader
est correctement connecté au QAbstractSensorReader::RunPoll
slot: la fonction virtuelle QBaseSerialSensorReader::RunPoll()
est appelée. La minuterie est également démarrée et la ReadData()
fonction fonctionne en émettant le acquired
signal. Mais ce signal ne semble alors pas être connecté au QSensor::Packet()
slot ni depuis QAbstractSensorReader
ni depuis l'espace de QBaseSerialSensorReader
noms.
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
Enregistrer un commentaire