QT6多线程QThread(一),这样最简单

Qt有两种多线程的方法,一种是实现QThread的run函数,另一种是定义一个继承于QObject的对象放入到一个Thread里,其实两种方法区别不大,用起来都比较方便。

Qt官方建议使用第二种方法,使用继承QObject的方法更加灵活,代码也更容易维护。本篇介绍第二种方法。

1、定义和实现任务类

  • 定义了两个类,Thread1和Thread2,一定要继承QOBject,因为只有QOBject才可以使用moveToThread()方法.
  • 每个类各自定义了三个方法,
方法名 含义
begin 任务
working 返回任务中的进度
finish 结束任务的返回值

myThread.h,全部代码

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>

class Thread1 : public QObject
{
    Q_OBJECT
public:
    explicit Thread1(QObject *parent = nullptr);
    void begin(int num);
signals:
    void working(int num);
    void finish(QString elapsedTime );

};


class Thread2 : public QObject
{
    Q_OBJECT
public:
    explicit Thread2(QObject *parent = nullptr);
    void begin(int num);
signals:
    void working(int num);
    void finish(QString elapsedTime );

};

#endif // MYTHREAD_H

2、实现任务方法

  • 只需要实现being方法,相当于thread中的run,方法名可以随便起。
  • 因为working和finish是信号函数,所以不需要实现

myThread.cpp,全部代码

#include "myThread.h"
#include <QElapsed
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 示例代码:#include <QThread> #include <QtSerialPort/QSerialPort>class SerialThread : public QThread { Q_OBJECTpublic: explicit SerialThread(QObject *parent = nullptr); ~SerialThread(); void run() override;private: QSerialPort *serialPort;private slots: void readData();signals: void dataReady(const QByteArray &data); }; ### 回答2: 以下是一个使用Qt6多线程接收串口数据的代码示例: ```cpp #include <QCoreApplication> #include <QSerialPort> #include <QSerialPortInfo> #include <QThread> class SerialReader : public QThread { Q_OBJECT public: SerialReader(QObject* parent = nullptr) : QThread(parent) { serialPort = new QSerialPort(this); connect(serialPort, &QSerialPort::readyRead, this, &SerialReader::readData); } void run() override { if (serialPort->open(QSerialPort::ReadWrite)) { while (!isInterruptionRequested()) { // 处理串口数据 QCoreApplication::processEvents(); } serialPort->close(); } else { qDebug() << "无法打开串口!"; } } signals: void dataReceived(const QByteArray& data); // 定义数据接收信号 private slots: void readData() { QByteArray data = serialPort->readAll(); emit dataReceived(data); // 发送数据接收信号 } private: QSerialPort* serialPort; }; class DataReceiver : public QObject { Q_OBJECT public: DataReceiver(QObject* parent = nullptr) : QObject(parent) { serialReader = new SerialReader(this); connect(serialReader, &SerialReader::dataReceived, this, &DataReceiver::handleData); } void start() { serialReader->start(); } private slots: void handleData(const QByteArray& data) { // 处理接收到的数据 qDebug() << "接收到数据:" << data; } private: SerialReader* serialReader; }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); DataReceiver dataReceiver; dataReceiver.start(); return a.exec(); } #include "main.moc" ``` 在这个例子中,我们首先创建了一个`SerialReader`类来接收串口数据。该类继承自`QThread`,重写了`run()`函数来打开串口并持续处理数据。在构造函数中,我们创建了一个`QSerialPort`对象并连接了`readyRead`信号到`readData`槽函数,该函数负责读取串口数据并发射一个`dataReceived`信号。 然后,我们创建了一个`DataReceiver`类来处理接收到的数据。该类继承自`QObject`,在构造函数中创建了一个`SerialReader`对象,并连接了`dataReceived`信号到`handleData`槽函数,该函数用来处理接收到的数据。 在主函数中,我们创建了一个`DataReceiver`对象并调用`start()`函数来启动串口数据接收。 以上是使用Qt6编写的一个多线程接收串口数据的示例代码。当有数据接收时,`handleData`函数会被调用来处理接收到的数据。你可以根据自己的实际需求进行修改和扩展。 ### 回答3: 下面是一个使用Qt6多线程接收串口数据的示例代码: ```cpp #include <QCoreApplication> #include <QSerialPort> #include <QThread> #include <QDebug> class SerialPortReader : public QObject { Q_OBJECT public: SerialPortReader(QSerialPort* serialPort) : m_serialPort(serialPort) {} public slots: void startReading() { if (m_serialPort->isOpen()) { connect(m_serialPort, &QSerialPort::readyRead, this, &SerialPortReader::readData); qDebug() << "Start reading from serial port"; } else { qDebug() << "Serial port is not open"; } } private slots: void readData() { QByteArray data = m_serialPort->readAll(); qDebug() << "Received data from serial port:" << data; // 在这里进行你的数据处理或其他操作 } private: QSerialPort* m_serialPort; }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QSerialPort serialPort; serialPort.setPortName("COM1"); // 设置串口名称,根据实际情况修改 serialPort.setBaudRate(QSerialPort::Baud115200); // 设置波特率,根据实际情况修改 if (serialPort.open(QIODevice::ReadOnly)) { SerialPortReader reader(&serialPort); QThread workerThread; reader.moveToThread(&workerThread); QObject::connect(&workerThread, &QThread::started, &reader, &SerialPortReader::startReading); workerThread.start(); int returnValue = a.exec(); workerThread.quit(); workerThread.wait(); serialPort.close(); return returnValue; } else { qDebug() << "Failed to open serial port"; return 1; } } ``` 这段代码使用了Qt框架的`QSerialPort`类来管理和访问串口。通过创建一个专门的`SerialPortReader`类,并在其中创建了一个独立的线程来处理串口数据的读取,从而实现了多线程接收串口数据的功能。在读取数据的槽函数`readData`中进行了简单的打印操作,你可以根据自己的需求在该函数中进行数据处理或其他具体操作。 在`main`函数中,首先创建一个`QSerialPort`对象并设置串口名称和波特率。然后尝试以只读模式打开串口,如果打开成功则创建`SerialPortReader`对象,并将其移动到一个独立的线程中。通过连接线程的`started`信号与`SerialPortReader`的`startReading`槽函数,可以在线程启动时开始读取串口数据。最后,调用`a.exec()`启动主事件循环,等待应用退出。在应用退出前,需要停止并等待线程结束,同时关闭串口。 请注意,以上代码是一个简单示例,实际应用中还需要进行错误处理、数据解析和其他相关操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值