Сходство с потоком: не удается создать дочерние элементы для родителя, который находится в другом потоке

Я видел аналогичный вопрос, но я чувствую, что реализую правильный шаблон, и все же не могу этого сделать!

Ну у меня есть Gui начать и остановить сбор данных с serial port и отображать необходимые сообщения связи. Чтобы сохранить Gui отзывчивый, я двигаю работник в потоке. Я пытался реализовать родство нитей, в соответствии с: Как правильно использовать QThread а также Как действительно, действительно использовать QThreads. Когда я нажимаю на кнопку запуска, я получаю;

QWinEventNotifier: event notifiers cannot be enabled from another thread
QWinEventNotifier: event notifiers cannot be enabled from another thread
QWinEventNotifier: event notifiers cannot be enabled from another thread
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QSerialPort(0x142cd390), parent's thread is QThread(0x1259b070), current thread is QThread(0x142db1f0)

Что мне не хватает? Вот часть кода, связанная с моим вопросом:

Рабочий заголовок

#ifndef COMPORT_H
#define COMPORT_H

#include <QObject>
#include <QDebug>
#include <QSerialPort>

class QTimer;

class ComPort : public QObject
{
Q_OBJECT

public:
explicit ComPort(const QString &portName, QObject* parent = 0);
~ComPort();

private:
QSerialPort*    port;
QString         portMsg;
QByteArray      responseData;
signals:
void finished();

private slots:
void onReadyRead();
void setupPort();

};

#endif // COMPORT_H

Рабочий cpp

#include "comport.h"
ComPort::ComPort(const QString &portName, QObject *parent)
:QObject(parent)
{
this->port = new QSerialPort(portName);
}

ComPort::~ComPort()
{
port->close();
delete port;
}

void ComPort::setupPort()
{
port->setBaudRate(QSerialPort::Baud19200);
port->setDataBits(QSerialPort::Data8);
port->setFlowControl(QSerialPort::NoFlowControl);
port->setParity(QSerialPort::NoParity);
port->setStopBits(QSerialPort::OneStop);

connect(port, SIGNAL(readyRead()), this, SLOT(onReadyRead()));

*SOME CODE HERE*
}

void ComPort::onReadyRead()
{
QByteArray bytes = port->readAll() ;
qDebug() << "bytes:" << bytes <<"\n";
responseData.append(bytes);
}

а также графический интерфейс пользователя

#include "gui.h"#include "ui_gui.h"
gui::gui(QWidget *parent) :
QDialog(parent),
ui(new Ui::gui)
{
ui->setupUi(this);
connect(ui->startButton, SIGNAL(clicked()), this, SLOT(OnstartButtonClicked()));
}

gui::~gui()
{
delete ui;
}

void gui::OnstartButtonClicked()
{
QThread*  cThread = new QThread;
ComPort*  cPort   = new ComPort(QString("COM4"));
cPort->moveToThread(cThread);
connect(cPort, SIGNAL(finished()), cThread, SLOT(quit()));
connect(cPort, SIGNAL(finished()), cPort, SLOT(deleteLater()));
connect(cThread, SIGNAL(finished()), cThread, SLOT(deleteLater()));
connect(cThread, SIGNAL(started()), cPort, SLOT(setupPort()));
cThread->start();
}

0

Решение

Спасибо за ответ от Ким Боулз Сёрхус, Я решил свою проблему. Я создавал последовательный порт в конструкторе ComPort это называется в главном потоке. Когда cPort объект перемещен в cThread QSerialPort все еще имеет свою привязку нити к исходной нити. Решение состоит в том, чтобы создать QSerialPort в ComPort::setupPort,

0

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

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