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

104 篇文章 120 订阅

一.前言
软件开发中,使用到线程就不可避免的要实现线程的暂停恢复停止等操作,总不可能说线程一旦启动就直接运行到结束了,中途不能停止啥的。线程的开始以及结束都比较简单,都有对应的接口可以调用,线程的暂停以及恢复就需要自己手动写个接口,关键在于使用线程锁来实现这个过程。
二.实现过程
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.本文只是简单实现线程的开始暂停恢复以及停止功能,但是实际运用过程中,还需要增加诸多的逻辑处理,比如暂停之前判断线程的状态再执行,恢复之前判断线程的状态再执行恢复等
2.源码下载链接

  • 15
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
你可以使用Qt的多线程机制来实现任务的暂停恢复和终止功能。以下是一个基本的示例代码: ```cpp #include <QThread> #include <QMutex> #include <QDebug> // 自定义的工作线程类 class WorkerThread : public QThread { public: // 构造函数 WorkerThread(QObject *parent = nullptr) : QThread(parent), m_paused(false), m_terminated(false) {} // 提供外部控制线程暂停的方法 void pause() { QMutexLocker locker(&m_mutex); m_paused = true; } // 提供外部控制线程恢复的方法 void resume() { QMutexLocker locker(&m_mutex); m_paused = false; m_condition.wakeAll(); } // 提供外部控制线程终止的方法 void terminate() { QMutexLocker locker(&m_mutex); m_terminated = true; m_condition.wakeAll(); } protected: // 线程执行函数 void run() override { int count = 0; while (true) { // 检查是否被暂停或终止 QMutexLocker locker(&m_mutex); if (m_paused) { m_condition.wait(&m_mutex); // 等待恢复信号 } if (m_terminated) { break; } // 执行任务 qDebug() << "Count:" << count++; msleep(1000); // 休眠1秒 } } private: QMutex m_mutex; QWaitCondition m_condition; bool m_paused; bool m_terminated; }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 创建并启动工作线程 WorkerThread workerThread; workerThread.start(); // 模拟控制任务的暂停恢复和终止 QTimer timer; timer.setInterval(3000); // 3秒后暂停任务 QObject::connect(&timer, &QTimer::timeout, [&workerThread]() { qDebug() << "Pausing task..."; workerThread.pause(); }); timer.start(); QTimer timer2; timer2.setInterval(6000); // 6秒后恢复任务 QObject::connect(&timer2, &QTimer::timeout, [&workerThread]() { qDebug() << "Resuming task..."; workerThread.resume(); }); timer2.start(); QTimer timer3; timer3.setInterval(9000); // 9秒后终止任务 QObject::connect(&timer3, &QTimer::timeout, [&workerThread]() { qDebug() << "Terminating task..."; workerThread.terminate(); }); timer3.start(); return a.exec(); } ``` 在上面的示例中,我们创建了一个名为`WorkerThread`的自定义线程类,它继承自`QThread`。该类提供了三个方法来控制线程暂停恢复和终止。 在`run()`函数中,我们使用一个无限循环来执行任务。在每次循环开始时,我们检查是否被暂停或终止。如果被暂停,则调用`m_condition.wait(&m_mutex)`等待恢复信号。如果被终止,则跳出循环,结束线程。 在主函数中,我们创建并启动了一个`WorkerThread`实例,并使用`QTimer`模拟控制任务的暂停恢复和终止。通过设置不同的定时器间隔,可以调整任务的执行时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值