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

 

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

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

    好了  ,开始准备工做。。。。线程

     开始以前,想说一下,,, 不少时候要达到某种目的,咱们总要重写某些函数,,好比,你点击窗体关闭的时候,你但愿点击关闭按钮须要弹出对话框用二次确认是否真关闭窗口,那这个时候怎么办呢?这个时候咱们就须要重写closeEvent函数,这样就能达到咱们的目的了。而closeEvent从哪儿来的,就是从继承过来的,,因此。。。咱们开始说线程对象

 

  1>先建立一个类,记住必定要继承QObjectblog

//这是头文件.h
#include<QObject> 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就能够了get

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

 

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

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中才是子线程是否是多了点好处。。。。。。it

 

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

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

 

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

 

先用了再说。。。。。。

相关文章
相关标签/搜索