#pragma once
#include "Common.h"
class WindowAppTaskView;
///
/// Task的执行线程体
///
class _TaskThread : public QObject, public QRunnable
{
Q_OBJECT
public:
_TaskThread(TASK* pRunningTask)
{
this->m_pRunningTask = pRunningTask;
};
~_TaskThread() {};
protected:
// 线程函数
virtual void run();
signals:
// 传递线程参数(暂未使用)
void sigThreadParams(TASK*);
private:
TASK* m_pRunningTask;
};
///
/// 用来管理Task信息和运行的数据结构
/// 任务执行原则:
/// (1) Task 如果选的是Runonce,无论选择的什么事件都是立即执行一轮,期间也不会等待任何事件的触发
/// Runonce的情况下,和Task选择的类型没有任何关系
/// (2) 循环任务,不等待事件直接运行;
/// (3) 如果是事件任务,则等待任务触发了执行一轮,每一轮都需要等待任务触发,如果任务执行过程中触发了事件,需要报警告
///
class TaskManager : public QObject
{
Q_OBJECT
// 单例模式
private:
TaskManager();
public:
// 获取实例
static TaskManager* getInstance()
{
if (m_pTaskManager == nullptr)
{
m_pTaskManager = new TaskManager();
}
return m_pTaskManager;
}
// 接收来自各个View的Task注册信息
void registerTask( TASK* pTask, WindowAppTaskView* pView);
// 获取所有的Task信息
QMap& getAllTasks()
{
return m_Tasks;
}
// 执行所有任务
bool executeAllTasks(bool bOnce = true);
// 停止所有任务
void stopAllTask(bool bForce = false);
// 为指定的Task添加Pou
void addTaskPous(const QString& strTaskName, const QVector& pous);
// 删除整个Task
void delTask(const QString& strTaskName);
// 删除指定Task中的一个Pou
void delTaskPou(const QString& strTaskName, const int& nPouIndex);
// 数据结构重置
void reset();
// 变量交换顺序
void swapTaskPou(const QString& strTaskName, const int& nIndex1, const int& nIndex2);
// 执行Task
void executeTask(const QString& strTaskName, bool bOnce = true);
// 执行Task(供线程调用)
void _executeTask(TASK* pTask);
// 执行Pou(线程执行)
void _executePou(TASK* pTask, POU* pPou, WindowAppTaskView* pView);
// 检查Task状态是否Busy
bool isTaskBusy(const QString& strTaskName = "");
// 为TaskView添加一个新的Tool(用于Pou中动态增加Tool同步更新信息)
void addToolToTaskView(const QString& strTaskName, const POU* pPou, const TOOL* pTool);
// 2021-8-21 更新,Task设置更新后,要及时更新 m_TaskEvents 中的Event和Task的对应关系
void updateTaskEvent(QEvent::Type oldType, TASK* pTask);
// 2022-3-5 根据TaskName查询TaskView的指针(用于Pou操作同步到TaskView,删除、移动顺序等)
WindowAppTaskView* getTaskViewByName(const QString& strTaskName)
{
return m_TaskViews.value(strTaskName);
}
// 2022-9-3 根据名字获取系统内置事件
EVENT* getSysEventByName(const QString& strName)
{
return m_sysEvents.value(strName);
}
// 2022-9-4 为了实现事件触发Tool等待执行而增加的系列函数
// 注册Tool和对应的触发事件的对应关系
void registerToolEvent(ToolEvent* toolEvent, TOOL* pTool);
// 查询本工具是否绑定了触发事件
bool isToolTriggerable(TOOL* pTool);
// 删除了一个工具的时候,需要到这里来反注册一下
void unregisterTool(TOOL* pTool);
// 通过Tool查询ToolEvents信息(目前用于序列化中)
ToolEvent* getEventByTool(TOOL* pTool);
// 2022-9-10,增加了Task完成时的数值触发动作,用于提供给外部进行绑定同步(向UI同步)
void syncTaskAndSystemParamsToUi(TASK* pTask);
// 2022-9-10,增加了Pou完成时的数值触发动作,用于提供给外部进行绑定同步(向UI同步)
void syncPouParamsToUi(POU* pPou);
public:
// 所有的系统内置事件
QMap m_sysEvents;
protected:
// 初始化系统事件
void initSysEvents();
// 执行Task的Event等待任务
bool waitForEvents(TASK* pTask);
// 设置tool为Busy状态
void setToolBusy(const POU* pPou, TOOL* pTool, WindowAppTaskView* pView);
// 设置tool为完成状态
void setToolDone(
POU* pPou,
TOOL* pTool,
QElapsedTimer& toolTimer,
WindowAppTaskView* pView
);
// 设置Pou为Busy状态
void setPouBusy(POU* pPou, WindowAppTaskView* pView);
// 设置Pou为完成状态
void setPouDone(POU* pPou, QElapsedTimer& pouTimer, WindowAppTaskView* pView);
// 设置Task为完成状态
void setTaskDone(TASK* pTask, QElapsedTimer& taskTimer, WindowAppTaskView* pView);
// 设置Task为完成StandBy
void setTaskStandBy(TASK* pTask, WindowAppTaskView* pView);
// 执行对应的工具
VPEnum::RETURN_VALUE ExecuteTool(ToolEvent* pToolEvent);
// 给Task 发送执行指令
void triggerTaskThread(ToolEvent* pToolEvent);
// 2022-9-4 ToolEvent还可以同时触发Tool执行(目前只有Wait工具可以触发)
void triggerToolExecution(ToolEvent* pToolEvent);
// 处理本轮中涉及到绑定至复杂控件中的变量,包括全局变量、Pou内部变量等(向Runtime触发)
// Reason:在所有Tool执行完一轮之后,需要检查一下Pou的内部变量是否有用做复杂控件的Index的,需要安排触发一下
// Reason2:每轮Task执行完毕之后,也需要安排触发一下
void syncComplexIndexToRuntime(QString strGroupName);
// 2022-9-25 WaitTool专用,判断Wait工具是否需要等待某一个值,并且这个值是否已经命中
bool isWaitToolHit(TOOL* pTool, ToolEvent* toolEvent);
protected slots:
// 接收来自接口的Event
virtual void customEvent(QEvent* event) override;
// void onEvent();
void onEventTimer();
private:
static TaskManager* m_pTaskManager;
QMap m_Tasks; // 当前运行的所有Task
QMap m_TaskViews; // Task对应的界面指针
QThreadPool m_TaskThreadPool; // 用于执行Task的线程池
QTimer m_eventTimer; // 启动一个Timer模拟系统事件
qint64 m_nTimerCounter; // 计数器,用来触发不同时间段的事件
QMultiHash m_EventTasks; // 用于触发Task的event id和task的对应关系(一对多)
QMultiHash m_EventTools; // 2022-9-4,用于触发Tool执行的的event id和Tool的对应关系(一对多)
QHash m_ToolEvents; // 2022-9-5,保存Tool和ToolEvent的对应关系(目前用于在序列化时做查询使用)
};