使用Qt也已经有一段时间了,虽然使用过继承QThread重写run函数,以及继承QObject然后使用MoveToThread两种方法实现多线程,但是在QSerialPort的使用过程中,两种方法都存在一定的问题。
典型的问题:QObject: Cannot create children for a parent that is in a different thread.
原因:在主线程中创建了QSerialPort对象在子线程中调用,或者在子线程中创建然后在主线程中调用了。
对于继承QThread重写run函数的情况,往往容易在run外部定义QSerialport *port = new QSerialport()对象,然后在run中调用port->readAll()等函数,然而根据QThread的特性,只有run函数才运行在新的子线程中,所以这里就跨线程调用了 QSerialport对象,会出现上述报错
已有解决办法:
要解决这样的问题,可以借鉴https://blog.csdn.net/u010842812/article/details/28898761这篇博文使用的方法:派生类外部定义QSerialPort指针,在run函数中再定义对象,并且数据的读、写都在run函数中进行。
上述方法可以解决报错,但是针对不仅仅具有读串口数据需求、还需要向串口写数据的情况,显然这样的方法会让run函数变得十分臃肿,代码的维护十分麻烦。
推荐办法:
运用继承QObject,结合MoveToThread()的方式:
自定义my_serial类,继承自QObject,将一个QThread local_thread 对象作为派生类的成员,使用QObject的MoveToThread()将派生类自己以及QSerialPort对象都移动到local_thread线程中,这样派生类中的槽函数以及QSerialPort中的信号与槽函数都将在local_thread线程执行。头文件:
#include <QObject>
#include <QSerialPort>
#include <QThread>
#include <QString>
#include <QByteArray>
#inc
348




被折叠的 条评论
为什么被折叠?



