123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- #pragma once
- #include "Common.h"
- class WindowAppTaskView;
- /// <summary>
- /// Task的执行线程体
- /// </summary>
- 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;
- };
- /// <summary>
- /// 用来管理Task信息和运行的数据结构
- /// 任务执行原则:
- /// (1) Task 如果选的是Runonce,无论选择的什么事件都是立即执行一轮,期间也不会等待任何事件的触发
- /// Runonce的情况下,和Task选择的类型没有任何关系
- /// (2) 循环任务,不等待事件直接运行;
- /// (3) 如果是事件任务,则等待任务触发了执行一轮,每一轮都需要等待任务触发,如果任务执行过程中触发了事件,需要报警告
- /// </summary>
- 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<QString, TASK*>& getAllTasks()
- {
- return m_Tasks;
- }
- // 执行所有任务
- bool executeAllTasks(bool bOnce = true);
- // 停止所有任务
- void stopAllTask(bool bForce = false);
- // 为指定的Task添加Pou
- void addTaskPous(const QString& strTaskName, const QVector<POU*>& 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<QString, EVENT*> 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<QString, TASK*> m_Tasks; // 当前运行的所有Task
- QMap<QString, WindowAppTaskView*> m_TaskViews; // Task对应的界面指针
- QThreadPool m_TaskThreadPool; // 用于执行Task的线程池
-
- QTimer m_eventTimer; // 启动一个Timer模拟系统事件
- qint64 m_nTimerCounter; // 计数器,用来触发不同时间段的事件
- QMultiHash<EVENT_ID, TASK*> m_EventTasks; // 用于触发Task的event id和task的对应关系(一对多)
- QMultiHash<EVENT_ID, TOOL*> m_EventTools; // 2022-9-4,用于触发Tool执行的的event id和Tool的对应关系(一对多)
- QHash<TOOL*, ToolEvent*> m_ToolEvents; // 2022-9-5,保存Tool和ToolEvent的对应关系(目前用于在序列化时做查询使用)
- };
|