与QTimer和QSerial的QThread - 育儿(QThread with QTimer

2019-11-04 13:51发布

我试图在一个不同的线程分配的“自给式”沟通对象,以防止它的GUI处理延迟隔离。

所以,在“AppCore”对象创建创建一个“CommCore”无父:

cAppCore::cAppCore(QObject *parent) : QObject(parent)
{
    ....
    CommCore = new cCommCore;
    (here I do signal-slot connections between CommCore and AppCore)
    ....
}

而在CommCore构造我做到以下几点:

cCommCore::cCommCore(QObject *parent) : QObject(parent)
{
    CommThread = new QThread(this);
    CommSerial = new QSerialPort(this);
    CommTimer = new QTimer(this);

    connect(CommSerial,&QSerialPort::readyRead,this,&cCommCore::ProcessRXByte);
    connect(CommSerial, static_cast<void (QSerialPort::*)(QSerialPort::SerialPortError)>(&QSerialPort::error), this, &cCommCore::HandleSerialError);
    connect(CommTimer, &QTimer::timeout, this,&cCommCore::TimerTimeout);

    CommTimer->start(OFFLINE_POLL_TIME);
    this->moveToThread(CommThread);
    CommThread->start(QThread::HighPriority);
}

现在我的问题:

1 - 这是确定以使线程处理对象的移动对象的孩子? 因为它是在GUI线程创建的(这里的构造函数被调用),然后转移到由自己处理线程(考虑到如果我需要的任何控制,我会从CommCore对象的内部处理它)

2 - 这是确定开始在构造函数中的计时器(这是在计时器构造方法相同的线程,GUI线程),并移至一切新的线程后,对不对?

3-如果我想以后启动定时器,唯一的办法是直通信号槽? 其中在GUI线程发出的并连接到一个CommCore槽(其随后将被排队和执行。CommCore线程)的信号

4-考虑到我的我的CommCore对象和AppCore(GUI线程)之间的所有交互都通信号时隙(这是线程安全),它是概念性地正确作出? (对象的想法本身和它的孩子们转移到一个新的线程,等等)

基于在池(由计时器计时)5-我的串行通信例程将从GUI处理延迟被屏蔽? (我的意思是,将有在由串行和定时器对象发生的事件的产生和处理没有延迟?)

Answer 1:

this->moveToThread(CommThread);

会成功,如果这个对象没有父。 所以,你需要改变你的构造方法的签名。 除此之外的,这是确定,因为对象是与它的孩子们搬进了...

计时器不应该启动这样的,因为它是移动到不同的线程。 您应该使用invokeMethod中,使得它是正确的螺纹,其同名但操作

QMetaObject::invokeMethod(CommTimer, "start");

为了您的遗留问题的所有答案都是肯定的。 只要你使用invokeMethod中使用的信号和呼叫,这是因为如果该线程是从可运行池中读取和运行它们。

所以线程安全的,不受该主线程中断。



文章来源: QThread with QTimer and QSerial - parenting