Вызов QEventLoop в QRunnable (для подключения к нескольким устройствам)

У меня есть QthreadPool для подключения до 5 последовательных устройств одновременно. Каждое последовательное устройство определяется как:

struct serialDevice
{
std::shared_ptr<QSerialPort>  port;
QByteArray                    portData;
};

Внутри графического интерфейса и после нажатия кнопки я вызываю диспетчер последовательных устройств serialManager->startAcquisition(portNames) следующее:

#include "serialmanager.h"serialManager::serialManager(QObject *parent) : QObject(parent)
{
pool = new QThreadPool();
pool->setMaxThreadCount(5);
}

void serialManager::startAcquisition(QStringList pNames)
{
foreach (QString port, pNames)
{
this->stablishConnection(port);
}
}

void serialManager::stablishConnection(QString pName)
{
ComPort *workerPort = new ComPort();
workerPort->setAutoDelete(true);
workerPort->setName(pName);

connect(this, SIGNAL(finished()), workerPort, SLOT(onTaskeFinished()));

pool->start(workerPort);
}

Как только устройство подключено, я опрашиваю устройство. Поток завершается, когда вызывается функция остановки.
Я ожидаю что readyRead() сигнал испускается, чтобы заполнить внутри sensor->portData:

#include "serialmanager.h"#include <QEventLoop>

ComPort::ComPort(QObject *parent) : QObject(parent)
{
}

void ComPort::run()
{
QEventLoop loop;
connect(this, SIGNAL(finished()), &loop, SLOT(quit()));

sensor       = std::make_shared<serialDevice> ();
sensor->port = std::make_shared<QSerialPort> ();
sensor->port->setPortName(this->portName);
sensor->port->setBaudRate(QSerialPort::Baud19200);
sensor->port->setDataBits(QSerialPort::Data8);
sensor->port->setFlowControl(QSerialPort::NoFlowControl);
sensor->port->setParity(QSerialPort::NoParity);
sensor->port->setStopBits(QSerialPort::OneStop);

QString strPort;
if (sensor->port->open(QIODevice::ReadWrite) == true)
{
connect(sensor->port.get(), SIGNAL(error(QSerialPort::SerialPortError)), this, SLOT(onErrorReceived()));
connect(sensor->port.get(), SIGNAL(readyRead()), this, SLOT(onReadyRead()));
}
else
{
strPort = "> " + sensor->port->portName() + " device is not streaming: " + sensor->port->errorString();
emit this->newMsgAvailable(strPort);
emit this->finished();
}
loop.exec();
}

void ComPort::onReadyRead()
{
QByteArray bytes = this->sensor->port->readAll();
this->sensor->portData.append(bytes);
}

void ComPort::onTaskeFinished()
{
QString strPort = "> Finished streaming at " + sensor->port->portName();
emit newMsgAvailable(strPort);
emit this->finished();
}

void ComPort::onErrorReceived()
{
QString strPort = "> Data stream on "  + sensor->port->portName() + " failed: " + sensor->port->errorString();
emit newMsgAvailable(strPort);
}

Определение проблемы:
readyRead() сигнал не был издан. Я прочитал здесь, что обрабатывать события в QRunnableпоток должен иметь свой собственный цикл обработки событий. Итак, я включил QEventLoop loop к Run() функция каждого ComPort, Сейчас readyRead() срабатывает, и я некоторое время получаю данные от каждого порта, а затем внезапно происходит сбой приложения с ошибкой сегментации:

0   VerifierDisableFaultInjectionExclusionRange C:\WINDOWS\syswow64\verifier.dll                0x53457378
1   VerifierDisableFaultInjectionExclusionRange C:\WINDOWS\syswow64\verifier.dll                0x53457495
2   VerifierDisableFaultInjectionExclusionRange C:\WINDOWS\syswow64\verifier.dll                0x5345b651
3   VerifierCheckPageHeapAllocation             C:\WINDOWS\syswow64\verifier.dll                0x53460b12
4   ??                                          C:\WINDOWS\SysWOW64\vfbasics.dll                0x533d179f
5   msvcrt!free                                 C:\WINDOWS\SysWOW64\msvcrt.dll                  0x7509b0f9
6   ??                                                                                          0x19120000
7   ??                                          C:\WINDOWS\SysWOW64\vfbasics.dll                0x533d26a5
8   QArrayData::deallocate                                                              130
9   QTypedArrayData<char>::deallocate                                                   234     0x6b9cbcfd
10  QByteArray::resize                                                                  1448    0x6b79bc23
11  QRingBuffer::append                                                                 383     0x645893ae
12  QSerialPortPrivate::_q_completeAsyncRead                                            529     0x6458523f
13  QSerialPort::qt_static_metacall                                                     353     0x64582dae
14  QMetaObject::activate                                                               3681    0x6b955027
15  QMetaObject::activate                                                               3547    0x6b95498c
16  QWinEventNotifier::activated                                                        134     0x6b9ad529
17  QWinEventNotifier::event                                                            241     0x6b976af1
18  QApplicationPrivate::notify_helper                                                  3499    0xf33df61
19  QApplication::notify                                                                2952    0xf33ba13
20  QCoreApplication::notifyInternal                                                    935     0x6b929eee
... <More>

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]