Qt - 多线程之线程的开始暂停恢复停止

news/2024/10/2 10:37:04

示例1

在Qt中,可以使用QThread的线程控制功能来暂停和恢复一个线程。这里是一个简单的例子:

#include <QThread>
#include <QDebug>class WorkerThread : public QThread {void run() override {qDebug() << "Thread is running";// 执行一些任务for (int i = 0; i < 5; ++i) {msleep(1000); // 模拟工作if (isInterruptionRequested()) {qDebug() << "Thread is interrupted";return;}}qDebug() << "Thread is finished";}
};void pauseThread(QThread* thread) {thread->requestInterruption(); // 请求暂停while (thread->isRunning()) {// 等待线程暂停}
}void resumeThread(QThread* thread) {thread->start(); // 重新开始线程
}int main() {WorkerThread thread;thread.start();// 假设需要暂停线程pauseThread(&thread);// 假设在这里做一些其他的事情// 现在我们要恢复线程resumeThread(&thread);// 等待线程结束thread.wait();return 0;
}

在这个例子中,我们定义了一个WorkerThread类,它是QThread的子类,并且在run函数中执行了一些模拟任务。我们使用requestInterruption()来请求暂停线程,并且在run函数中检查isInterruptionRequested()来决定是否退出。

pauseThread函数请求暂停并且循环等待线程真正暂停。resumeThread函数则简单地重新开始线程。在main函数中,我们创建了一个WorkerThread对象,启动了线程,然后调用pauseThread来暂停它,接着我们可以恢复线程。

请注意,这个例子是为了演示如何暂停和恢复线程。在实际应用中,请确保你不会因为暂停一个线程而导致数据不一致或者其他的线程安全问题。此外,这种方法不适用于那些已经在等待事件发生的线程,因为在等待期间线程不会检查中断请求。

 

 

示例2

一.前言

软件开发中,使用到线程就不可避免的要实现线程的暂停恢复停止等操作,总不可能说线程一旦启动就直接运行到结束了,中途不能停止啥的。线程的开始以及结束都比较简单,都有对应的接口可以调用,线程的暂停以及恢复就需要自己手动写个接口,关键在于使用线程锁来实现这个过程。

二.实现过程

1.1先继承QThread实现自己的线程类,声明线程锁变量,以及暂停恢复停止的接口

1.2核心代码(.h)

/** 线程开始 暂停 恢复 停止 例程* V1.0 2021-12-27
*/#ifndef THREAD3_H
#define THREAD3_H#include <QObject>
#include <QThread>
#include <QDebug>
#include <QTime>
#include <QCoreApplication>
#include <QMutex>class Thread3 : public QThread
{
public:Thread3();~Thread3(){}public:void close();void pauseThread();void resumeThread();protected:void run();private:volatile bool stop_;bool pause_;QMutex pauseLock;int i;
};#endif // THREAD3_H

 

1.3其他说明

增加关键字volatile是为了:提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,就会出现不一致的现象

2.cpp核心代码

#include "Thread3.h"Thread3::Thread3()
{stop=false;pause=false;i=0;
}void Thread3::close()
{stop=true;quit();wait();
}void Thread3::pauseThread()
{qDebug()<<"pauseThread";this->pauseLock.lock();pause=true;
}void Thread3::resumeThread()
{qDebug()<<"resumeThread";this->pauseLock.unlock();pause=false;
}void Thread3::run()
{while(i<10){if(!stop){// 线程锁在业务开始和和结束的地方pauseLock.lock();// 具体的业务逻辑i++;qDebug()<<i<<"-"<<QTime::currentTime()<<"-"<<"CurrnetThreadID:"<<QThread::currentThreadId();msleep(1000);//pauseLock.unlock();}else{break;}}
}

3.1调用核心代码

void Widget::on_pushButton_1_clicked()
{qDebug()<<"线程开始";thread->start();
}void Widget::on_pushButton_2_clicked()
{qDebug()<<"线程暂停";thread->pauseThread();
}void Widget::on_pushButton_3_clicked()
{qDebug()<<"线程恢复";thread->resumeThread();
}void Widget::on_pushButton_4_clicked()
{qDebug()<<"线程停止";thread->close();
}

 

3.2效果预览

 

三.其他

1.本文只是简单实现线程的开始暂停恢复以及停止功能,但是实际运用过程中,还需要增加诸多的逻辑处理,比如暂停之前判断线程的状态再执行,恢复之前判断线程的状态再执行恢复等

 

 

——————————————

原文链接:https://blog.csdn.net/Joker__123/article/details/122165065

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/44825.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

国思RDIF.vNext全新低代码快速开发框架平台6.1版本发布(支持vue2、vue3)

RDIF.vNext全新低代码快速开发框架平台6.1版本发布(支持vue2、vue3)。全新设计,全新开发,代码量减少70%,运行的速度也得到了质的提升,基于.NET6+全新开发,前后端分离,支持Web、App、客户端、微信等,适配各种行业和场景需求。想做各种软件,用RDIF框架都好办!1、平台介…

tomato

21,80,2211,88888 爆破目录 访问 http://192.168.52.129/antibot_image/ 发现存在目录 antibots,接着访问该目录,发现存在很多文件 访问 http://192.168.52.129/antibot_image/antibots/info.php,找到 phpinfo 的信息,F12查看源码发现 hint,存在文件包含漏洞 前面信息搜…

恒隆云上配置One-2-3-45

前ICPC算法竞赛退役选手|现摸鱼ing

OceanBase主机CPU超过85% SQL性能急剧下降案例

之前在培训的时候,OceanBase的老师就说过,当主机CPU使用率超过85%之后,SQL的就会急剧下降。最近分析问题的时候刚好碰到相关案例,简单记录下 ocp记录的主机CPU相关信息如下问题SQL的执行情况: 从下面的SQL执行情况可以看到,在6-1号的时候问题SQL在下午六点半开始执行,平…

HTTP1.x HTTP2 HTTP3 的简单对比

协议 简要描述 比喻HTTP1.0 短连接,一次数据通信,结束后就断开 一次性道路,简单暴力通过。HTTP1.1 长连接,连接可以被复用,但需要按照资源顺序复用。 单向单车道,婚礼车队,不能逆序。HTTP2 连接复用,增加了http头部压缩和帧传输,连接可以被异步服用,服务器端可以主动…

首批!华为云盘古研发大模型通过代码大模型评估,获当前最高等级

在通用能力、专用场景能力应用成熟度三个能力域上均获优异结果。本文分享自华为云社区《首批!华为云盘古研发大模型通过代码大模型评估,获当前最高等级》,作者: 华为云头条。 近日,在中国信通院组织的首轮代码大模型评估中,华为技术有限公司的华为云盘古研发大模型最终获…

技能

①word文档编辑时,缩小界面时旁边的空白部分怎么移除:使用视图的web或者大纲模式即可②如何将ted的英文和中文文稿,全篇设置成一句一句对应的文章:

物理隔离后数据怎么导入和导出?安全U盘一键解决

政府单位、军工和科研所、航空航天企业、金融机构、医疗单位、电力企业、生物制药实验室等企业及单位,因研发和生产过程、或日常经营中涉及大量敏感信息和技术,需要通过物理隔离来确保网络的安全性。因此,多采用物理隔离的方式进行网络建设。物理隔离后,仍有数据需要交换,…