Qt之先用了再说系列-多线程方式2

 

继Qt之先用了再说系列-多线程方式2

  本次说说在Qt里多线程使用第2种方式,也是qt官方比较推荐用的方式,相对与直接继承QThread 重写run方法中灵活了一些,如果第一次使用可能会转不湾来,没有直接重写run来的方便些,等等你多用几遍你自己也会分辨那种适合自己了。。。。

    好了  ,开始准备工作。。。。

     开始之前,想说一下,,, 很多时候要达到某种目的,我们总要重写某些函数,,比如,你点击窗体关闭的时候,你希望点击关闭按钮需要弹出对话框用二次确认是否真关闭窗口,那这个时候怎么办呢?这个时候我们就需要重写closeEvent函数,这样就能达到我们的目的了。而closeEvent从哪儿来的,就是从继承过来的,,所以。。。我们开始说线程

 

  1>先创建一个类,记住一定要继承QObject

//这是头文件.h
#include class A:public QObject //这里一要继承QObject { public: //构造函数 // 析构函数

//我们希望子线程运行的函数,这里我随便写了3个 public slots: void onThreadFun1(); //成员函数1,随便命名 void onThreadFun2(); //成员函数2,随便命名 void onThreadFun3(); //成员函数3,随便命名 }
//这是源文件.cpp

析构,构造....省略

void A::OnThreadFun1()
{
  qDebug()<<"子线程运行1";
}

void A::OnThreadFun2()
{
qDebug()<<"子线程运行2";
}

void A::OnThreadFun3()
{
qDebug()<<"子线程运行3";
}

 

 

  2>上面创建好了这类以后,接下来我看看如何调用才会在子线程中运行,看看跟重载run是否一样

为了说明,假设有个B类,这个类,就相当与我用向导创造出来的那个默认的widget类一样,你就把他当做widget就可以了

按照下面6个步骤填写,只要一执行到步骤6,onThreadFun1(),onThreadFun2(),onThreadFun3(), 就会在子线程中运行了,步骤6相当于run中使用start()函数一样。

 

#include "A.h"  //包含我们写的头文件
#include   //线程类,必须包含

int main()
{
    A a;                      //步骤1:声明一个对象
   QThread thread1;  //步骤2:声明一个线程对象

    a.moveToThread(thread1);  //步骤3:把a这个对象移动到thread1线程中
    thread1.start();      // 步骤4:开启线程,此时线程并没有执行,只是开启,先不管,记住步骤

   //假设有个B类,里面有个信号click,为了简单说明
    connect(b,&B::click,a,&A::onThreadFun1);   //步骤5:连接A类,我们写的函数
    connect(b,&B::click,a,&A::onThreadFun2);   //步骤5:连接A类,我们写的函数
    connect(b,&B::click,a,&A::onThreadFun3);   //步骤5:连接A类,我们写的函数
    
    
    emit b.click();  //步骤6:发射信号,相当与重写run函数中,用start()开启一样    
    
}

  

 

 结语:此类多线程方法相对与重写run函数会复杂一点点,但是可以看到,子线程运行的函数有3个或者还有更多,看你自己喜欢。。。相对与重写run中,只有run中才是子线程是不是多了点好处。。。。。。

 

   机制:  通过发射信号,槽函数onThreadFun1(),onThreadFun2(),onThreadFun3(),接受到信号运行,此时运行线程会是子线程。

   核心:a.moveToThread(thread1);   thread1.start();  正因为有了这两句,槽函数才能在子线程中运行。。。

 

学会方法:,,,多写几次,理解理解就ok了,第一次是很痛苦的,为什么他要这么做。。。。。。越深究,还有connect的第5个参数呢,,什么?还有第5个参数。。。。。。

 

先用了再说。。。。。。

 

 

    

 

你可能感兴趣的:(Qt之先用了再说系列-多线程方式2)