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

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

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

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

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

//这是头文件.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就可以了

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

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

 

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

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

 

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

 

先用了再说。。。。。。

    

Qt之先用了再说系列-多线程方式2的更多相关文章

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

    Qt 多线程的用法还是比较简单的,也比较好用,接下来我们就分析分析如何使用. 说起Qt 线程的使用方式,一般有2种使用方式,具体哪种比较好看自己心情了,现在有官方的推荐用法,用不用还是看你心情的 好, ...

  2. 移动开发在路上-- IOS移动开发系列 多线程二

    最近太忙没太多的时间,忙碌的码农生活空下来一点时间,都会挤出来看一些技术或者咨询的文章,废话不多说,直奔主题. 接着上一次的继续说. 定时器在多线程的使用 NSRunLoop 是线程相关的基础框架的一 ...

  3. 【ALB技术笔记】基于多线程方式的串行通信接口数据接收案例

    基于多线程方式的串行通信接口数据接收案例 广东职业技术技术学院  欧浩源 1.案例背景 在本博客的<[CC2530入门教程-06]CC2530的ADC工作原理与应用>中实现了电压数据采集的 ...

  4. 【ALB学习笔记】基于多线程方式的串行通信接口数据接收案例

    基于多线程方式的串行通信接口数据接收案例 广东职业技术技术学院  欧浩源 1.案例背景 在本博客的<[CC2530入门教程-06]CC2530的ADC工作原理与应用>中实现了电压数据采集的 ...

  5. java 网络编程基础 TCP/IP协议:服务端ServerSocket;客户端Socket; 采用多线程方式处理网络请求

    1.Java中客户端和服务器端通信的简单实例 Java中能接收其他通信实体连接请求的类是ServerSocket,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一 ...

  6. Qt封装QTcpServer参考资料--QT4中构建多线程的服务器

    首先说一下对多线程这个名词的理解过程.以前听说过很多次多线程这个词,而且往往与服务器联系起来,因此一直把多线程误解为服务器特有的功能:直到这次课程设计,仔细学习了一下多线程的机制,才知道真正的意思.简 ...

  7. 【QT】子类化QObject+moveToThread实现多线程

    往期链接: <QThread源码浅析> <子类化QThread实现多线程> 从往期<QThread源码浅析>可知,在Qt4.4之前,run 是纯虚函数,必须子类化Q ...

  8. Qt之先用了再说系列-信号与槽

    QT之信号与槽 简介:信号与槽可是Qt最大成功点,也是整个Qt基本核心机制,如果不会信号与槽,将无法领略Qt之美: 1.信号与槽函数原型: QObject::connect(const QObject ...

  9. C#基础系列——多线程的常见用法详解

    前言:前面几节分别介绍了下C#基础技术中的反射.特性.泛型.序列化.扩展方法.Linq to Xml等,这篇跟着来介绍下C#的另一基础技术的使用.最近项目有点紧张,所以准备也不是特别充分.此篇就主要从 ...

随机推荐

  1. UnsupportedClassVersionError的错误处理

    造成这种错误的原因是支持Tomcat运行的JDK版本与支持application运行的JDK版本不一致导致的. 解决办法: 将JDK版本改成一致. 步骤 1.Window ——> Prefere ...

  2. oracle数据库查询分组之外的数据方法

    select * from (select t.*,row_number() over(partition by 分组字段 order by rownum) rn from 表名 t where 条件 ...

  3. sql与SQL CODE和SQL State相关报错

    操作数据库过程中,遇到许多问题,很多都与SQL CODE和SQL State相关,现在把一个完整的SQLCODE和SQLState错误信息和相关解释作以下说明,一来可以自己参考,对DB2错误自行找出原 ...

  4. void operator()()的功能

    在学习多线程的时候看到这样的一段代码,为什么要重载()呢?真有这个必要吗? #include <iostream> #include <thread> class Counte ...

  5. Python Ethical Hacking - BACKDOORS(8)

    Cross-platform hacking All programs we wrote are pure python programs They do not rely on OS-specifi ...

  6. T1 找试场 题解

    拖延症又犯了QwQ. 今天上午考试了,按照惯例,我仍然要把我会的所有题的题解写一遍. 1.找试场(way.cpp/in/out) 问题描述 小王同学在坐标系的(0,0)处,但是他找不到考试的试场,于是 ...

  7. 给咱的服务器安装BBR脚本

    yum -y install wget ##ContOS Yum 安装 wget apt-get install wget ##Debian Ubuntu 安装 wget 先给咱的服务器安装wget, ...

  8. JQuery如何在验证表单失败的情况下阻止表单提交

    自定义验证时,使用了return false和event.preventDefault(),但是验证失败之后表单还是提交了 这个问题我也碰到了,尝试了多次也没有用,在调试的时候也发现确实return了 ...

  9. 《java常用设计模式之----单例模式》

    一.简介 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创 ...

  10. Mybatis——@MapperScan原理

    @MapperScan配置在@Configuration注解的类上会导入MapperScannerRegistrar类. 而MapperScannerRegistrar实现了ImportBeanDef ...