首页 > 其他分享 >Qt - 多线程之线程的开始暂停恢复停止

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

时间:2024-06-13 10:33:00浏览次数:21  
标签:include Qt thread void Thread3 暂停 线程 多线程

示例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

 

标签:include,Qt,thread,void,Thread3,暂停,线程,多线程
From: https://www.cnblogs.com/zhuchunlin/p/18245368

相关文章

  • PyQT5之多页面切换
    fromPyQt5.QtWidgetsimportQApplication,QWidget,QStackedLayout,QVBoxLayoutfromPyQt5.QtWidgetsimportQPushButton,QComboBox,QSizePolicyimportsysif__name__=='__main__':app=QApplication(sys.argv)my_widget=QWidget()my_w......
  • 【java基础】线程池的状态流转
    前言:首先要知道什么是线程池?池化:数据库连接池,线程池,字符串常量池线程是用来执行任务的,如果不用线程池,那么线程每次使用前创建,使用后释放,资源利用率低。所以说用线程池提高了线程对象利用率。所以可以用线程池完成,先创建好那么多个线程对象在那等着,类比银行客户等待窗口办理......
  • 【java基础】java线程的四种创建方式
    1.继承Thread类 2.实现Runnable接口 因为Runnable接口就是支持函数式编程的接口,可以这么玩 3.实现Callable接口,用FutureTask<T>获取返回值。FutureTask还是继承的Runnable接口   4.创建线程池Executors。由于Executors提供的等待队列LinkedBlockingQ是无界......
  • 基于imx6ull_pro中qtcreator环境搭建
    目录(一)说明(二)qt_creator安装(三)qt_creator配置与环境搭建(四)qt_creator所遇问题(一)说明1使用版本Descriptionubuntu18.04.2LTSRelease......
  • 线程池 (重点)概述&7大参数理解
    目录1、线程池思想概述2、什么是线程池?3、不使用线程池的问题4、线程池的工作原理5、线程池实现的API、参数说明 5.1、谁代表线程池? 5.2、如何得到线程池对象 5.3、ThreadPoolExecutor构造器的参数说明 6、线程池常见面试题 6.1、临时线程什么时候创建啊? 6.2......
  • 线程池的使用:批量导入、数据汇总、异步保存搜索记录
    文章目录1、场景一:MySQL批量导入数据到ES1.1CountDownLatch1.2流程图1.3代码实现1.4效果2、场景二:数据汇总2.1流程图2.2代码实现3、场景三:异步调用3.1需求3.2代码实现1、场景一:MySQL批量导入数据到ES场景:需要将库里的1000万左右的数据量,导入到ES索引库中......
  • GATK不能多线程的问题
    问题:申请了多线程但是只能单线程 17:13:48.941INFOIntelPairHmm-Availablethreads:117:13:48.941INFOIntelPairHmm-Requestedthreads:417:13:48.941WARNIntelPairHmm-Using1availablethreads,but4wererequested 解决方法:exportOMP_N......
  • QTime序列化时间处理(字符串与秒、毫秒互转)
    秒转为时、分、秒格式inttime_sec=11320;QStringtime=QTime(0,0,0).addSecs(static_cast<int>(time_sec)).toString(QString::fromLatin1("HH:mm:ss"));qDebug()<<time;//输出:"03:08:40"毫秒转为时、分、秒、毫秒格式inttime_ms=211320;QString......
  • 线程池
    从上图可以看到,线程被创建出来之后,都处于睡眠态,它们实际上是进入了条件量的等待队列中。而任务都被放入一个链表,被互斥锁保护起来。下面是线程池里面线程们的一生:\1.被创建\2.写遗书(准备好退出处理函数,防止在持有一把锁的状态中死去)\3.试图持有互斥锁(等待任务)\4.判断是......
  • 【C】线程池实现
    后续会移植为C++版文章目录一、线程池原理二、一些函数2.1pthread_cond_wait()2.2pthread_cond_signal()2.3pthread_create()2.4pthread_exit()三、任务队列定义四、线程池定义五、头文件内容threadpool.h六、.c文件实现6.1threadpool.c文件6.2TestMain测......