• 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.源码下载链接

  • 相关阅读:
    CocoaPods的基本使用方法
    【STM32】电能表抄表功能实现|自学笔记
    【STM32】串口收发驱动Drv_Uart|学习笔记
    【STM32】SYSCLK配置|学习笔记
    【stm32】的PWM外设|学习笔记
    【JavaScript】setAttribute在添加事件时失效解决办法
    三步建立自己域名的主页,Github Pages功能简明手册
    Java生成UUID 与 MySQL数据库如何生成uuid数据
    利用Excel办公软件快速拼接SQL
    Java实现几种常见排序方法
  • 原文地址:https://www.cnblogs.com/xiaohai123/p/16258675.html
Copyright © 2020-2023  润新知