У меня есть класс с последовательным интерфейсом, который передает некоторые данные и emit
a MessageReceived
сигнал при получении некоторых действительных данных:
Последовательный. c
void Serial::on_serialPort_readData()
{
... Other stuff...
else
{
qDebug() << "Received in serial";
emit MessageReceived(_mReceivedData);
}
}
}
И у меня есть главное окно, которое открывает последовательное соединение и запускает транзакцию сообщения. Но мне нужно получить много данных, и передача займет некоторое время, поэтому я решил использовать QThread
для обработки полученных данных.
Я создал поток и рабочий в моем mainwindow.cpp
(код от здесь ):
основное окно. cpp
_mThread = new QThread(this);
_mThreadWorker = new Worker();
_mThreadWorker->moveToThread(_mThread);
// Like in the example
connect(_mThread, &QThread::started, _mThreadWorker, &Worker::Progress);
connect(_mThreadWorker, &Worker::Finished, _mThread, &QThread::quit);
connect(_mThreadWorker, &Worker::Finished, _mThreadWorker, &Worker::deleteLater);
connect(_mThread, &QThread::finished, _mThread, &QObject::deleteLater);
connect(_mProtocolInterface, &Serial::MessageReceived, _mThreadWorker, &Worker::UpdateData);
_mThread->start();
// Send the first packet so the receiver will answer
Последовательный интерфейс будет отправлять данные в разных пакетах и я прочитал здесь , что плохая идея использовать последовательный порт в отдельном потоке, поэтому я решил использовать последовательный порт в главном потоке и соединить сигнал MessageReceived
с UpdateData
слот моего работника:
работник.ч
class Worker : public QObject
{
Q_OBJECT
...
public slots:
void Progress(void);
void UpdateData(QByteArray Data);
public:
Worker(QObject* parent = nullptr);
~Worker();
...
};
работник. cpp
void Worker::UpdateData(QByteArray Data)
{
qDebug() << "Received in Worker";
_mData = Data;
}
void Worker::Progress(void)
{
while(_mActive)
{
switch(_mState)
{
case STATE_INIT:
{
_mState = STATE_INIT;
// Just a idle to simulate the data transfer during debugging
break;
}
}
}
}
Но после получения данных от получателя вызывается только слот on_serialPort_readData
:
>> Received in serial
Так почему не вызывается слот UpdateData
класса Worker
?