Qt之线程的开始暂停恢复停止(转)
Published on 2022-05-11 16:50 in 分类: Qt with 萧海~
分类: Qt

Qt之线程的开始暂停恢复停止(转)

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

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

    posted @   萧海~  阅读(391)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · winform 绘制太阳,地球,月球 运作规律
    · AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
    · 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
    · 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
    · 上周热点回顾(3.3-3.9)
    点击右上角即可分享
    微信分享提示
    电磁波切换