简介
开发环境: vs2015 + Qt 5.9.8
主要特点: 实现对线程中执行流程的控制,支持开始、停止、暂停、继续
功能演示
代码简述
Executor.h
将执行器封装为Executor类,主要成员如下:
executionEngine_:执行引擎,执行业务逻辑
executionThread_:执行引擎需要使用的线程
通过调用接口控制执行流程,接口如下:
startExecution:开始执行
stopExecution:停止执行
pauseExecution:暂停执行
continueExecution:继续执行
在执行状态发生变更时,执行器发出信号:signal_executionStatusChanged
class Executor : public QObject
{
Q_OBJECT
public:
explicit Executor(QObject *parent = nullptr);
signals:
void signal_executionStatusChanged(ExecutionStatus status);
public:
static Executor * getInstance();
public:
void startExecution();
void stopExecution();
void pauseExecution();
void continueExecution();
private:
//执行引擎
ExecutionEngine * executionEngine_;
//执行线程
QThread * executionThread_;
private:
//实例
static Executor * instance_;
//实例 互斥锁
static QMutex instanceMutex_;
private:
//自动回收内存
class Recycler
{
public:
~Recycler()
{
if (instance_ != nullptr)
{
delete instance_;
instance_ = nullptr;
}
}
};
static Recycler recycler_;
};
Executor.cpp
创建线程和执行引擎,通过moveToThread的方式将执行引擎添加到执行线程内。
Executor::Executor(QObject *parent) : QObject(parent)
{
executionEngine_ = new ExecutionEngine();
connect(executionEngine_,&ExecutionEngine::signal_executionStatusChanged,this,&Executor::signal_executionStatusChanged);
executionThread_ = new QThread(this);
executionEngine_->moveToThread(executionThread_);
connect(executionThread_,&QThread::destroyed,executionEngine_,&ExecutionEngine::deleteLater);
executionThread_->start();
}
ExecutionEngine.h
将执行器封装为Executor类,主要成员如下:
status_:执行状态
pauseWaitCondition_:暂停等待条件
通过调用setExecutionStatus控制执行流程,参数如下:
ReadyRun:准备开始(执行引擎对ReadyRun状态进行响应后,状态更新为Running)
ReadyPause:准备暂停(执行引擎对ReadyPause状态进行响应后,状态更新为Paused)
ReadyStop:准备停止(执行引擎对ReadyStop状态进行响应后,状态更新为Stopped)
在执行状态发生变更时,执行器发出信号:signal_executionStatusChanged
class ExecutionEngine : public QObject
{
Q_OBJECT
public:
explicit ExecutionEngine(QObject *parent = nullptr);
~ExecutionEngine();
signals:
void signal_executionStatusChanged(ExecutionStatus status);
public slots:
void execute();
public:
ExecutionStatus getExecutionStatus();
void setExecutionStatus(ExecutionStatus status);
private:
//执行状态
ExecutionStatus status_;
//执行状态读写锁
QReadWriteLock statusRWL_;
//暂停
QWaitCondition pauseWaitCondition_;
};