教你简单几步使用Qt5.12的多线程技术

本文只是讲解如何使用,并不讲解其中实现原理。

1.首先在Widget或者其他你认为要用到地方包含相关的头文件(以下皆是在Widget下用)

#include 
#include     //方便打印

因Qt5的线程运用结合了信号与槽,这跟Qt4和C++本身的线程运用有点不一样。

2.先添加一个自定义类,一定要继承QObject类或者QWidget类有关的类,不然都没有信号与槽的实现基础,切记。参考如下图

教你简单几步使用Qt5.12的多线程技术_第1张图片

3.其次在在该类中写上那些耗时间或者是打算利用QThread::sleep等延时函数的相关处理函数。

void go(){
    doSomeing;
    ...
}

3.再在上图的signals:写上自定义的信号(这个信号视情况而写,没用上可以不写,一般用于子线程向其他线程传递信息),

   例如:

void runStart(void);

4.然后回到Widget类,在该类中也定义一个信号,此信号是用来启动子线程

signals:
    void wStart();

5.在Widget类中,定义俩个变量

private:
    QThread *thread;
    Run *run;

  并在Widget的构造函数进行初始化

thread = new QThread(this);
run = new Run();    //由于子线程的存活时间可能跟主线程的存活时间不一致,所以不指定父对象
run->moveToThread(thread);  //将run类与thread进行“捆绑”
connect(this,&Widget::wStart,run,&Run::go);    //进行信号与槽的绑定
thread->start();                //开启线程
emit wStart();                  //发出信号,启动子线程的指定槽函数go

6.为了方便回收子线程资源,可在自定义信号与槽来绑定,也可以在其析构函数中定义如下:

Widget::~Widget()
{
    thread->quit();
    thread->wait();
    delete ui;
}

7.方便大家观察现象,我另外在go和Widget函数中加上以下代码

void Run::go()
{
    qDebug() << "开始子线程";
    QThread::sleep(1);  //等待1秒
    qDebug() << "子线程1秒过后";
    QThread::sleep(1);
    qDebug() << "子线程2秒过后";
    QThread::sleep(1);
    qDebug() <<" 子线程即将结束";
}

教你简单几步使用Qt5.12的多线程技术_第2张图片

运行结果

教你简单几步使用Qt5.12的多线程技术_第3张图片

你可能感兴趣的:(Qt,studing,C++,Qt)