#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的对应关系(目前用于在序列化时做查询使用) };