Qt6 多线程

一、继承QThread,重写run方法

创建任务类Task,Task类继承自QThread,通过重写QThread的run方法在run方法中实现真正需要实现的业务逻辑,在主线程中调用start方法执行业务:

// Task.h
class Task : public QThread  // 继承自QThread
{
    Q_OBJECT
public:
    explicit Task(QObject *parent = nullptr);

protected:
    void run() override { qDebug() << QThread::currentThread(); }    // 重写run方法
};

在主线程中调用start方法执行子线程任务:

// mainwindow.cpp
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    Task *task = new Task;  // 创建Task实例
    task->start();  // 执行业务逻辑
}

二、继承自QObject,灵活控制任务数量

继承QObject的方式需要在主线程中创建QThread的实例,通过moveToThread()将任务移动到线程实例中执行。这种方式更灵活,但也较为复杂:
1、首先创建Task类,继承自QObject。
2、定义一个任务槽函数,用于实现业务逻辑。
3、(可选)定义一个用于开始任务的信号
4、在主线程(MainWindow)中创建一个QThread实例和Task实例,通过moveToThread()将Task实例移动到QThread实例中。
5、连接信号与任务槽函数

// Task.h
class Task : public QObject
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = nullptr);
    
public slots:
    void working();
};

在主线程中连接信号与任务槽:


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    // 实例化
    QThread thread;
    Task task;
    
    // 将任务移动到thread线程中
    task.moveToThread(&thread);
    
    // 连接信号与槽
    QObject::connect(&thread, &QThread::started, &task, &Task::working);
    
    // 触发QThread::started信号
    thread.start();
}

这里的执行顺序是通过thread.start()发出一个QThread::started信号,由该信号连接到了Task::working函数,从而执行该函数。

posted on 2025-03-13 23:24  TN-mo  阅读(76)  评论(0)    收藏  举报