Qt学习(九):QT中使用线程
知识点
- 大量的数据处理任务放到子线程里面
- 线程创建
- 线程回收
- 线程处理函数内部,不允许操作图形界面
- 子线程处理一个死循环任务,通过改变标志位,让其退出死循环
- 子线程处理结束后,发送一个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中使用线程相关推荐
- Qt学习之Qt基础入门(中)
1. 前言 上一篇博客,总结了Qt的一些基础用法,这篇博客继续跟视频学习Qt的常用方法 Qt入门系列: Qt学习之C++基础 Qt学习之Qt安装 Qt学习之Qt基础入门(上) Qt学习之Qt基础入门( ...
- Qt学习之Qt基础入门(下)
1. 前言 前两篇博客简单的阐述了一下Qt的入门用法,这篇博客继续跟着视频学习. Qt入门系列: Qt学习之C++基础 Qt学习之Qt安装 Qt学习之Qt基础入门(上) Qt学习之Qt基础入门(中) ...
- Qt学习第5天:线程与数据库【笔记】
文章目录 1. 线程 为什么需要使用线程 线程使用 Qt 4中比较简单 Qt 5中的线程 线程画图示例 2. 数据库 数据库连接 数据库插入 数据库删除和遍历 可视化操作数据库 1. 线程 为什么需要 ...
- Qt 学习(三) —— Qt 模块
1. Qt 模块简介 Qt由许多模块组成,分别支持不同领域的功能,主要分为 Essentials 和 Add-On. Qt Essential 是基本模块,它们可以在所有受支持的开发平台和经过测试的目 ...
- 嵌入式学习之QT学习---14 QT跨平台运行之把QT程序交叉编译到ARM开发板
想要把qt工程放到开发板上运行,就需要用到交叉编译.由于qt是跨平台的,所以只需要换个编译器编译一下就可以. 以qt学习–计时器的例子为例,在移植之前还需要进行一个准备工作,在windows下运行的时 ...
- 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. ...
- Java多线程学习九:怎样确定线程数量及CPU 核心数和线程数的关系||如何定制自己的线程池
调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能.在实际工作中,我们需要根据任务类型的不同选择对应的策略. CPU 密集型任务 首先,我们 ...
- React学习(九)-React中发送Ajax请求以及Mock数据
虽互不曾谋面,但希望能和你成为笔尖下的朋友 以读书,技术,生活为主,偶尔撒点鸡汤 不作,不敷衍,意在真诚吐露,用心分享 点击左上方,可关注本刊 撰文 | 川川 VX-ID:suibichuanji 点 ...
- Qt学习(12)——Qt5中的容器
QVector QList QStringList QSet QMap 自定义类的排序 容器是通用类,用于将给定类型的项存储在内存中.C++有标准模板库(STL)有自己的容器.在Qt中可以使用Qt容器 ...
最新文章
- 点阵大屏语音感应时计——人体感应
- linux搭建gitlab内网,ubuntu14搭建内网gitlab服务器(示例代码)
- capistrano部署ruby on rails应用
- linux 搭建gradle android jenkins打包机器,gradle 依赖 jar问题
- x3-02 java_Day13 -- Java流程控制02
- 【转】10分钟精通SharePoint - VS开发模板
- 中山大学计算机是A类学科吗,中山大学a类学科有哪些?附中大a类学科名单
- 大屏监控系统实战(15)-打包上线及总结
- MyBatis的CURD
- 「代码随想录」70. 爬楼梯【动态规划】(完全背包解法)
- [转载]如何为Foxmail设置gmail客户端
- 一年级计算机知识竞赛,2016一年级语文下册基础知识竞赛试题
- 闲鱼曝光量突然降低是为什么呢?
- reference pics
- 酷狗免费下载歌曲(网易云同样适用)
- oracle查看所有表信息和字段信息以及注释信息等
- TSC打印机打印条形码和二维码,applet实现方式
- 多态的实现机制是什么?
- 每个人心中都有一艘小白船
- OpenJDK16 ZGC 源码分析