繁体   English   中英

带有QTimer和QSerial的QThread-育儿

[英]QThread with QTimer and QSerial - parenting

我试图在一个不同的线程中分配一个“自包含”通信对象,以使其与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-可以使Thread处理程序对象成为已移动对象的子级吗? 因为它是在GUI线程(调用构造函数)中创建的,然后移到它自己处理的线程中(考虑到如果我需要对其进行任何控制,我将从CommCore对象内部对其进行处理)

2-可以在构造函数中启动计时器(与计时器构造函数GUI线程在同一线程中),然后将所有内容移到新线程中就可以了吗?

3-如果我想稍后再启动计时器,唯一的办法是通过信号插槽? 在GUI线程中发出并连接到CommCore插槽(然后将在CommCore线程中排队并执行)的信号

4-考虑到我在CommCore对象和AppCore(GUI线程)之间的所有交互都是通过信号插槽(线程安全的)进行的,从概念上讲是正确的吗? (对象的想法将自身及其子代移动到新线程,等等)

5-我的基于池的串行通信例程(由计时器计时)是否可以避免GUI处理延迟? (我的意思是,在串行和计时器对象生成的事件的生成和处理中不会有延迟吗?)

this->moveToThread(CommThread);

如果没有父对象的对象将成功。 因此,您需要更改构造函数的签名。 除此之外,还可以,因为对象及其子对象一起移动了...

计时器不应该这样启动,因为它被移到了另一个线程中。 您应该使用invokeMethod,以便执行操作的正确线程

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

对于您剩下的问题,所有答案都是肯定的。 只要您使用信号并使用invokeMethod进行调用,就好像该线程正在从可运行库中获取并运行它们。

这样线程安全,不受主线程中断的影响。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM