知识点

  • 大量的数据处理任务放到子线程里面
  • 线程创建
  • 线程回收
  • 线程处理函数内部,不允许操作图形界面
  • 子线程处理一个死循环任务,通过改变标志位,让其退出死循环
  • 子线程处理结束后,发送一个delDone信号让其主线程捕捉,触发槽函数

完整项目github地址:

https://github.com/taw19960426/Qt_study/tree/main/QThread

结果演示

线程创建流程图

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QThread>#include <QDebug>
#define cout qDebug() << "[" << __FILE__ <<":" << __LINE__ << "]"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);myThread=new MyThread(this);//线程创建//通过set函数设置标志位 默认为假myThread->setIsStop(false);//get获取私有成员bool ans=myThread->getStopValue();cout<<ans;//cout<<myThread->isStop;//直接获取不到connect(&myTimer,&QTimer::timeout,this,&Widget::delTimer);//线程任务结束后返回delDone信号,关闭定时器connect(myThread,&MyThread::delDone,this,&Widget::myThreadDone);//关闭主窗口时线程退出//当按窗口右上角x时,窗口触发destroyed()connect(this,&Widget::destroyed,this,&Widget::killMyThread);}void Widget::killMyThread(){//关闭主窗口,让线程结束任务myThread->setIsStop(true);//停止线程myThread->quit();//等待线程处理完手头动作myThread->wait();cout<<"关闭主窗口,线程资源回收";
}void Widget::delTimer(){static int i = 0;ui->lcdNumber->display(i);i++;
}void Widget::myThreadDone(){//关闭定时器cout<<"线程处理结束,关闭定时器";myTimer.stop();
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{//如果定时器没有激活,才启动if(!myTimer.isActive()){myTimer.start(20);}if(myThread->isRunning()){return;}//    //需要处理复杂的任务
//    QThread::sleep(5);//    myTimer.stop();//启动线程myThread->start();
}void Widget::on_buttonClose1_clicked()
{if(!myThread->isRunning()){return;}//cout<<"555555555";//通过标志位结束线程死循环,让线程发出delDone()信号myThread->setIsStop(true);Widget::myThreadDone();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTimer>
#include "mythread.h"namespace Ui {class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private slots:void on_pushButton_clicked();void on_buttonClose1_clicked();private:Ui::Widget *ui;QTimer myTimer;MyThread *myThread;private:void delTimer();//定时器槽函数void myThreadDone();//线程结束处理槽函数void killMyThread();//窗口关闭 线程退出
};#endif // WIDGET_H

mythread.cpp

#include "mythread.h"
#include <QDebug>MyThread::MyThread(QObject *parent) :QThread(parent)
{isStop=false;}void MyThread::run(){//线程处理函数//很复杂的数据处理//需要耗时5s//sleep(5);while (!isStop) {sleep(1);qDebug() << "子线程号:" << QThread::currentThread();//通过标志位来跳出循环if(isStop){break;}}//处理完以后发出结束信号emit delDone();
}bool MyThread::getStopValue(){return isStop;
}void MyThread::setIsStop(bool flag){isStop=flag;
}

mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H#include <QThread>class MyThread : public QThread
{Q_OBJECT
public:explicit MyThread(QObject *parent = 0);public://get set函数必须公有publicbool getStopValue();//通过set函数设置标志位 默认为假void setIsStop(bool flag=false);private://QThread的虚函数//线程处理函数//不能直接调用,通过start()间接调用void run();bool isStop;signals:void delDone();public slots:};#endif // MYTHREAD_H

Qt学习(九):QT中使用线程相关推荐

  1. Qt学习之Qt基础入门(中)

    1. 前言 上一篇博客,总结了Qt的一些基础用法,这篇博客继续跟视频学习Qt的常用方法 Qt入门系列: Qt学习之C++基础 Qt学习之Qt安装 Qt学习之Qt基础入门(上) Qt学习之Qt基础入门( ...

  2. Qt学习之Qt基础入门(下)

    1. 前言 前两篇博客简单的阐述了一下Qt的入门用法,这篇博客继续跟着视频学习. Qt入门系列: Qt学习之C++基础 Qt学习之Qt安装 Qt学习之Qt基础入门(上) Qt学习之Qt基础入门(中) ...

  3. Qt学习第5天:线程与数据库【笔记】

    文章目录 1. 线程 为什么需要使用线程 线程使用 Qt 4中比较简单 Qt 5中的线程 线程画图示例 2. 数据库 数据库连接 数据库插入 数据库删除和遍历 可视化操作数据库 1. 线程 为什么需要 ...

  4. Qt 学习(三) —— Qt 模块

    1. Qt 模块简介 Qt由许多模块组成,分别支持不同领域的功能,主要分为 Essentials 和 Add-On. Qt Essential 是基本模块,它们可以在所有受支持的开发平台和经过测试的目 ...

  5. 嵌入式学习之QT学习---14 QT跨平台运行之把QT程序交叉编译到ARM开发板

    想要把qt工程放到开发板上运行,就需要用到交叉编译.由于qt是跨平台的,所以只需要换个编译器编译一下就可以. 以qt学习–计时器的例子为例,在移植之前还需要进行一个准备工作,在windows下运行的时 ...

  6. C++后续:QT学习(Qt概述,创建QT项目)

    目录 声明 一. Qt概述 1.1 什么是Qt 1.2 Qt的发展史 1.3 Qt支持的平台 1.4 Qt版本 1.5 Qt的下载与安装 1.6 Qt的优点 二.创建 Qt项目 2.1 如何创建 2. ...

  7. Java多线程学习九:怎样确定线程数量及CPU 核心数和线程数的关系||如何定制自己的线程池

    调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能.在实际工作中,我们需要根据任务类型的不同选择对应的策略. CPU 密集型任务 首先,我们 ...

  8. React学习(九)-React中发送Ajax请求以及Mock数据

    虽互不曾谋面,但希望能和你成为笔尖下的朋友 以读书,技术,生活为主,偶尔撒点鸡汤 不作,不敷衍,意在真诚吐露,用心分享 点击左上方,可关注本刊 撰文 | 川川 VX-ID:suibichuanji 点 ...

  9. Qt学习(12)——Qt5中的容器

    QVector QList QStringList QSet QMap 自定义类的排序 容器是通用类,用于将给定类型的项存储在内存中.C++有标准模板库(STL)有自己的容器.在Qt中可以使用Qt容器 ...

最新文章

  1. 点阵大屏语音感应时计——人体感应
  2. linux搭建gitlab内网,ubuntu14搭建内网gitlab服务器(示例代码)
  3. capistrano部署ruby on rails应用
  4. linux 搭建gradle android jenkins打包机器,gradle 依赖 jar问题
  5. x3-02 java_Day13 -- Java流程控制02
  6. 【转】10分钟精通SharePoint - VS开发模板
  7. 中山大学计算机是A类学科吗,中山大学a类学科有哪些?附中大a类学科名单
  8. 大屏监控系统实战(15)-打包上线及总结
  9. MyBatis的CURD
  10. 「代码随想录」70. 爬楼梯【动态规划】(完全背包解法)
  11. [转载]如何为Foxmail设置gmail客户端
  12. 一年级计算机知识竞赛,2016一年级语文下册基础知识竞赛试题
  13. 闲鱼曝光量突然降低是为什么呢?
  14. reference pics
  15. 酷狗免费下载歌曲(网易云同样适用)
  16. oracle查看所有表信息和字段信息以及注释信息等
  17. TSC打印机打印条形码和二维码,applet实现方式
  18. 多态的实现机制是什么?
  19. 每个人心中都有一艘小白船
  20. OpenJDK16 ZGC 源码分析

热门文章

  1. AtCoder AGC037E Reversing and Concatenating
  2. java nio 追加写文件_Java NIO在文件末尾追加数据
  3. 原生Get请求和Post请求
  4. HDU 3507 Print Article(斜率优化DP)
  5. 在iOS的XCode工程配置中为什么要用-all_load-ObjC
  6. 更易型算法(Manipulating Algorithms)
  7. 【大数据技术】操作系统和Hadoop版本选择
  8. Docker删除镜像
  9. 如何让你的webapp也能跳窗口搜索
  10. 【极光推送】给指定用户发送消息