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

  • 相关阅读:
    一个布局里面引用另一个布局的控件
    字符串的操作
    代码中使用bitmap资源并加载到控件上
    ui主线程控件的更新就让这个activity的异步任务做完整
    java语法:字符串数组的赋值
    文件路径的格式
    Android布局及属性归总(查询用)
    代码里语句的顺序狠重要。。。
    社交里互评、点赞的实现
    小功能——类似微信里,评论内容里面,点击每个人的用户名进入个人主页
  • 原文地址:https://www.cnblogs.com/xiaohai123/p/16258675.html
Copyright © 2020-2023  润新知