继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. 阅读手札 | 手把手带你探索『图解 HTTP』

    前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 Github 博客 学习清单: 一.网络基础 TCP/IP 通常使用的网络(包括互联网)是在 TCP/IP 协议族的基础上 ...

  2. Python+selenium自动化测试之浏览器基础操作

    **​​前言** 本文主要讲解webdriber框架,Selenium 就像真实用户所做的一样,Selenium 测试可以在 Windows.Linux 和 Macintosh上的 Internet ...

  3. Ethical Hacking - NETWORK PENETRATION TESTING(7)

    Gaining Access to encrypted networks Three main encryption types: 1. WEP 2.WPA 3.WPA2 WEP Cracking W ...

  4. swagger -- 前后端分离的API接口

    文章目录 一.背景 二.swagger介绍 三.在maven+springboot项目中使用swagger 四.swagger在项目中的好处 五.美化界面 参考链接:5分钟学会swagger配置 参考 ...

  5. vscode 无法自动补全第三方库

    点击Settings 找到“Extentions”下的“Python”,点击“Auto Completes: Extra Paths”的“Edit in settings.json”,如下图: 在se ...

  6. js读取其他网页内容(同源)

    通过xss第一次取得网页内容,然后获取到管理员账号页面进行二次盲打.js需要保留script部分其余去除. <html><p id='d1'></p> <sc ...

  7. HTML骨架

    本文只是复习HTML笔记 html 骨架: DTD:文档类型定义,规定了使用哪个版本的html规范 html 标签:双标签,表示整个网页 head 标签: 配置HTML页面 title: 网页标题 m ...

  8. springboot项目部署到tomcat步骤以及常见问题

    ------------恢复内容开始------------ 本文分为两个部分,一,是打包的步骤,二,是我项目中所遇到的问题以及解决方法 一. 打包为war包步骤 1.修改打包方式为war 在pom. ...

  9. 彻底弄懂angularJS表单验证

    常用的表单验证指令 (基本概念) 1. 必填项验证 某个表单输入是否已填写,只要在输入字段元素上添加HTML5标记required即可: <input type="text" ...

  10. PHP date_diff() 函数

    ------------恢复内容开始------------ 实例 计算两个日期间的差值: <?php$date1=date_create("2013-03-15");$da ...