1. 程式人生 > 其它 >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.原始碼下載連結