一.前言
軟體開發中,使用到線程就不可避免的要實作線程的暫停恢複停止等操作,總不可能說線程一旦啟動就直接運作到結束了,中途不能停止啥的。線程的開始以及結束都比較簡單,都有對應的接口可以調用,線程的暫停以及恢複就需要自己手動寫個接口,關鍵在于使用線程鎖來實作這個過程。
二.實作過程
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;
}
}
}