【发布时间】:2014-06-26 21:33:39
【问题描述】:
按照官方文档,我正在尝试这样做:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
QThread *thread = new QThread;
Worker *worker= new Worker();
worker->moveToThread(thread);
//init connections
thread->start();
}
Worker 构造函数:
Worker::Worker(QObject *parent) :
QObject(parent)
{
serial = new QSerialPort(this); //passing the parent, which should be the current thread
}
没有编译错误,但是当我执行它时会抛出这个:
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QSerialPort(0x11bd1148), parent's thread is QThread(0x11bd2ef8), current thread is QThread(0x3e47b8)
也就是说,它告诉我serial 的父线程是主线程,而不是我创建的线程。
如果我不在构造函数中而是在主进程中实例化序列,结果相同,这是在我们调用thread->start() 后触发的:
Worker::Worker(QObject *parent) :
QObject(parent)
{
}
Worker::doWork()
{
if(!serial)
serial= new QSerialPort(this);
//...
}
我错过了什么?
以发送函数为例(一个槽):
void Worker::send(const QByteArray &data)
{
serial->write(data);
if( serial->waitForBytesWritten(TIMEOUT) )
qDebug() << "sent: " << data;
}
【问题讨论】:
-
我认为没有必要。是 QSerialPort 类 [1]:qt-project.org/doc/qt-5/qserialport.html#QSerialPort
-
是的。在没有创建 foo 之前,不会抛出错误。该程序似乎运行良好,但该错误也不是一件好事。
-
我用其他类型的对象测试过,似乎没有问题,所以问题完全是 QSerialPort :(
-
删除那些,看看你是否仍然收到相同的消息。
-
@LaszloPapp 因为我正在运行一个 GUI 应用程序,并且有一个任务,我必须通过串行端口(逐行)发送文件。如果我在主线程中执行该任务,GUI 将冻结。
标签: c++ qt qthread qtcore qtserialport