Qt中使用线程之QThread

news/2024/10/27 13:55:56/

使用Qt中自带的线程类QThread时

1、需要定义一个子类继承自QThread

2、重写run()方法,在run方法中编写业务逻辑

3、子类支持信号槽

4、子类的构造函数的执行是在主线程进行的,而run方法的执行是在子线程中进行的

常用方法

静态方法

获取线程id

可以得到当前线程的id

[static noexcept] Qt::HANDLE QThread::currentThreadId()

线程睡眠

 void msleep(unsigned long msecs)//单位毫秒void sleep(unsigned long secs)//单位秒(since 6.6) void sleep(std::chrono::nanoseconds nsecs)//单位纳秒void usleep(unsigned long usecs)//单位微秒

公共方法

判断线程是否执行完毕

bool QThread::isFinished() const

判断线程是否正在运行

bool QThread::isRunning() const

判断线程是否被请求中断了

bool QThread::isInterruptionRequested() const

可以在子线程中的run函数中通过这个函数获知是否需要中断退出了

发出中断请求

调用这个方法可以向线程发起中断请求,调用后:isInterruptionRequested()会返回true

void QThread::requestInterruption()

等待线程

是一个阻塞函数,调用他来确保线程已经执行完毕

bool QThread::wait(QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))

通常使用其默认参数,如果线程一直不执行完毕,那么该函数的调用者将会一直被阻塞,直到线程执行完毕

公有槽函数

启动线程

通常我们调用该函数来启动线程

[slot] void QThread::start(QThread::Priority priority = InheritPriority)

终止线程

通常我们调用该方法强制终止一个线程,但不建议

[slot] void QThread::terminate()

常用信号

线程开始执行时会发出started信号

线程执行完毕退出后会发出finished信号 

这两个都是私有信号,只能被连接,不能用来主动发射

 void finished()void started()

举例:

点击开启按钮,会开启一个线程

点击关闭按钮,会发出中断请求,使得线程退出

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QThread>
#include<QPushButton>class Thread01:public QThread
{Q_OBJECT
public:Thread01(int num):m_num(num){//构造函数的调用是在主线程//可以打印线程id,查看区别qDebug()<<"线程id:"<<QThread::currentThreadId();}~Thread01()=default;protected://重写run方法void run() override{//run函数在子线程中运行qDebug()<<"线程id:"<<QThread::currentThreadId();while(1){//如果请求中断的话就退出if(isInterruptionRequested()){return;}//循环自增,然后打印qDebug()<<m_num++;}}
private:int m_num=0;};class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr) : QWidget(parent){resize(300,300);QPushButton* btn=new QPushButton("开启线程",this);btn->setGeometry(10,10,100,100);QPushButton* btn2=new QPushButton("退出线程",this);btn2->setGeometry(10,btn->geometry().bottom()+10,100,100);//创建线程Thread01* th=new Thread01(100);//从100开始自增connect(btn,&QPushButton::clicked,this,[=](){//开启线程if(!th->isRunning()){th->start();}});connect(btn2,&QPushButton::clicked,this,[=](){//线程正在执行的话if(th->isRunning()){//中断线程th->requestInterruption();}//使用wait方法确保线程退出了if(th->wait()){qDebug()<<"线程退出了";}});}~Widget()=default;
private:};
#endif // WIDGET_H

学习链接:https://github.com/0voice


http://www.ppmy.cn/news/1542356.html

相关文章

【Python】Whoosh:全流程自建搜索引擎

Whoosh是一个纯Python编写的全文搜索库&#xff0c;适用于快速构建搜索引擎。 环境部署 在开始使用Whoosh之前&#xff0c;你需要确保你的开发环境已经正确设置。以下是详细的环境部署步骤。 安装Python 首先&#xff0c;确保你的系统上安装了Python。Whoosh支持Python 2.7…

第二章 Vue之插值表达式

目录 一、引言 二、演示效果 三、完整代码 一、引言 插值表达式 {{ }} 是一种Vue的模板语法 语法&#xff1a;{{ 表达式 }} 作用&#xff1a;利用表达式进行插值&#xff0c;渲染到页面中。 注意&#xff1a; 1. 表达式是可以被求值的代码&#xff0c;JS引擎会将其计算出一个…

Java面试题——微服务篇

1.微服务的拆分原则/怎么样才算一个有效拆分 单一职责原则&#xff1a;每个微服务应该具有单一的责任。这意味着每个服务只关注于完成一项功能&#xff0c;并且该功能应该是独立且完整的。最小化通信&#xff1a;尽量减少服务之间的通信&#xff0c;服务间通信越少&#xff0c…

Linux 中 .bash_history、.bash_logout 等用户配置文件

目录 前言.bash_history.bash_logout.bash_profile.bashrc.cshrc.tcshrc.viminfo 总结 前言 在 Linux 中我们经常会看见用户家目录下存在 .bash_history、.bash_logout、.bash_profile、.bashrc、.cshrc、.tcshrc、.viminfo 这写文件&#xff0c;那它们区别是什么呢&#xff1…

【数据结构】贪心算法:决策的艺术

贪心算法&#xff08;Greedy Algorithm&#xff09;是一类在每一步选择中都采取局部最优解的方法&#xff0c;希望最终能够达到全局最优解。通俗地说&#xff0c;贪心算法的思想就是“每一步都尽量做出最好的选择”&#xff0c;以期望整个过程的最终结果也达到最优状态。贪心算…

出处不详 凸多边形最优三角剖分

目录 出处不详 凸多边形最优三角剖分题目描述背景输入输出数据范围 题解 出处不详 凸多边形最优三角剖分 题目描述 背景 给定 n n n边凸多边形&#xff0c;要求确定该凸多边形的三角剖分&#xff08;将多边形分割成 n − 2 n - 2 n−2个三角形&#xff09;&#xff0c;使得该…

C++ | Leetcode C++题解之第503题下一个更大元素II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {int n nums.size();vector<int> ret(n, -1);stack<int> stk;for (int i 0; i < n * 2 - 1; i) {while (!stk.empty() &am…

秋叶启动器下,如何升级ComfyUI的pytorch版本到2.5

最近测试mochi在comfyui里的表现效果&#xff0c;发现这个相关的节点总是装不上。后来到节点官方看了下作者说明&#xff0c;要求torch版本至少2.5以上。 而comfyui最近官方刚更新了torch的支持版本。如下&#xff1a; 如果是自己手工部署过的&#xff0c;那就正常部署和升级t…