QT moveToThread用法详解

内容分享2天前发布
0 2 0

QT moveToThread用法详解

QT多线程

Qt程序中开启多线程有多种方式,如:

  1. 继承QThread类,重写run函数
  2. 继承自QObject,并调用moveToThread函数
  3. 调用QtConcurrent::run函数,传入耗时函数即参数

本篇文章主要对moveToThread的用法进行详解。

moveToThread使用步骤

步骤1:

创建耗时操作类Worker,同时继承QObject,耗时操作都以槽的方式实现,如work1、work2……

Worker.h

#ifndef WORKER_H
#define WORKER_H

#include <QObject>

class Worker : public QObject
{
    Q_OBJECT
public:
    explicit    Worker(QObject *parent = nullptr);

signals:

public slots:
    void        work1(); // 耗时操作1
    void        work2(); // 耗时操作2
};

#endif // WORKER_H

Worker.cpp

#include "Worker.h"
#include <QThread>
#include <QDebug>

Worker::Worker(QObject *parent) : QObject(parent)
{

}

void Worker::work1()
{
    QThread::msleep(1000);
    qDebug() << "work1";
}

void Worker::work2()
{
    QThread::msleep(2000);
    qDebug() << "work2";
}

这里的耗时操作比较简单粗暴,即直接调用msleep,分别等待1s和2s。

步骤2:

新建QThread实例:

QThread *pThread = new QThread;

步骤3:

新建Worker实例:

Worker *pWorker = new Worker;

步骤4:

使用Worker实例调用moveToThread函数,并传入QThread的实例作为参数:

pWorker->moveToThread(pThread);

步骤5:

关联信号和槽:

connect(this, SIGNAL(startWork1()), pWorker, SLOT(work1())); // 执行耗时操作1
connect(this, SIGNAL(startWork2()), pWorker, SLOT(work2())); // 执行耗时操作2
connect(pThread, SIGNAL(finished()), pWorker, SLOT(deleteLater())); // 析构Worker类

步骤6:

启动线程:

pThread->start();

此时所有的准备工作都已完成,下面只需要在要执行耗时操作的地方发送相应的信号即可。

步骤7:

emit startWork1();

emit startWork2();

步骤8:

关闭线程:

pThread->quit();
pThread->wait();

效果演示

00:00

可以看到所有耗时操作都在排队进行,而且主界面也丝毫不受影响,没有任何卡顿。

© 版权声明

相关文章

2 条评论

  • 头像
    阳明悟行学宫 读者

    非常清晰明了

    无记录
    回复
  • 头像
    我不想不想多说话 读者

    收藏了,感谢分享

    无记录
    回复