TaskManager.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. #pragma once
  2. #include "Common.h"
  3. class WindowAppTaskView;
  4. /// <summary>
  5. /// Task的执行线程体
  6. /// </summary>
  7. class _TaskThread : public QObject, public QRunnable
  8. {
  9. Q_OBJECT
  10. public:
  11. _TaskThread(TASK* pRunningTask)
  12. {
  13. this->m_pRunningTask = pRunningTask;
  14. };
  15. ~_TaskThread() {};
  16. protected:
  17. // 线程函数
  18. virtual void run();
  19. signals:
  20. // 传递线程参数(暂未使用)
  21. void sigThreadParams(TASK*);
  22. private:
  23. TASK* m_pRunningTask;
  24. };
  25. /// <summary>
  26. /// 用来管理Task信息和运行的数据结构
  27. /// 任务执行原则:
  28. /// (1) Task 如果选的是Runonce,无论选择的什么事件都是立即执行一轮,期间也不会等待任何事件的触发
  29. /// Runonce的情况下,和Task选择的类型没有任何关系
  30. /// (2) 循环任务,不等待事件直接运行;
  31. /// (3) 如果是事件任务,则等待任务触发了执行一轮,每一轮都需要等待任务触发,如果任务执行过程中触发了事件,需要报警告
  32. /// </summary>
  33. class TaskManager : public QObject
  34. {
  35. Q_OBJECT
  36. // 单例模式
  37. private:
  38. TaskManager();
  39. public:
  40. // 获取实例
  41. static TaskManager* getInstance()
  42. {
  43. if (m_pTaskManager == nullptr)
  44. {
  45. m_pTaskManager = new TaskManager();
  46. }
  47. return m_pTaskManager;
  48. }
  49. // 接收来自各个View的Task注册信息
  50. void registerTask( TASK* pTask, WindowAppTaskView* pView);
  51. // 获取所有的Task信息
  52. QMap<QString, TASK*>& getAllTasks()
  53. {
  54. return m_Tasks;
  55. }
  56. // 执行所有任务
  57. bool executeAllTasks(bool bOnce = true);
  58. // 停止所有任务
  59. void stopAllTask(bool bForce = false);
  60. // 为指定的Task添加Pou
  61. void addTaskPous(const QString& strTaskName, const QVector<POU*>& pous);
  62. // 删除整个Task
  63. void delTask(const QString& strTaskName);
  64. // 删除指定Task中的一个Pou
  65. void delTaskPou(const QString& strTaskName, const int& nPouIndex);
  66. // 数据结构重置
  67. void reset();
  68. // 变量交换顺序
  69. void swapTaskPou(const QString& strTaskName, const int& nIndex1, const int& nIndex2);
  70. // 执行Task
  71. void executeTask(const QString& strTaskName, bool bOnce = true);
  72. // 执行Task(供线程调用)
  73. void _executeTask(TASK* pTask);
  74. // 执行Pou(线程执行)
  75. void _executePou(TASK* pTask, POU* pPou, WindowAppTaskView* pView);
  76. // 检查Task状态是否Busy
  77. bool isTaskBusy(const QString& strTaskName = "");
  78. // 为TaskView添加一个新的Tool(用于Pou中动态增加Tool同步更新信息)
  79. void addToolToTaskView(const QString& strTaskName, const POU* pPou, const TOOL* pTool);
  80. // 2021-8-21 更新,Task设置更新后,要及时更新 m_TaskEvents 中的Event和Task的对应关系
  81. void updateTaskEvent(QEvent::Type oldType, TASK* pTask);
  82. // 2022-3-5 根据TaskName查询TaskView的指针(用于Pou操作同步到TaskView,删除、移动顺序等)
  83. WindowAppTaskView* getTaskViewByName(const QString& strTaskName)
  84. {
  85. return m_TaskViews.value(strTaskName);
  86. }
  87. // 2022-9-3 根据名字获取系统内置事件
  88. EVENT* getSysEventByName(const QString& strName)
  89. {
  90. return m_sysEvents.value(strName);
  91. }
  92. // 2022-9-4 为了实现事件触发Tool等待执行而增加的系列函数
  93. // 注册Tool和对应的触发事件的对应关系
  94. void registerToolEvent(ToolEvent* toolEvent, TOOL* pTool);
  95. // 查询本工具是否绑定了触发事件
  96. bool isToolTriggerable(TOOL* pTool);
  97. // 删除了一个工具的时候,需要到这里来反注册一下
  98. void unregisterTool(TOOL* pTool);
  99. // 通过Tool查询ToolEvents信息(目前用于序列化中)
  100. ToolEvent* getEventByTool(TOOL* pTool);
  101. // 2022-9-10,增加了Task完成时的数值触发动作,用于提供给外部进行绑定同步(向UI同步)
  102. void syncTaskAndSystemParamsToUi(TASK* pTask);
  103. // 2022-9-10,增加了Pou完成时的数值触发动作,用于提供给外部进行绑定同步(向UI同步)
  104. void syncPouParamsToUi(POU* pPou);
  105. public:
  106. // 所有的系统内置事件
  107. QMap<QString, EVENT*> m_sysEvents;
  108. protected:
  109. // 初始化系统事件
  110. void initSysEvents();
  111. // 执行Task的Event等待任务
  112. bool waitForEvents(TASK* pTask);
  113. // 设置tool为Busy状态
  114. void setToolBusy(const POU* pPou, TOOL* pTool, WindowAppTaskView* pView);
  115. // 设置tool为完成状态
  116. void setToolDone(
  117. POU* pPou,
  118. TOOL* pTool,
  119. QElapsedTimer& toolTimer,
  120. WindowAppTaskView* pView
  121. );
  122. // 设置Pou为Busy状态
  123. void setPouBusy(POU* pPou, WindowAppTaskView* pView);
  124. // 设置Pou为完成状态
  125. void setPouDone(POU* pPou, QElapsedTimer& pouTimer, WindowAppTaskView* pView);
  126. // 设置Task为完成状态
  127. void setTaskDone(TASK* pTask, QElapsedTimer& taskTimer, WindowAppTaskView* pView);
  128. // 设置Task为完成StandBy
  129. void setTaskStandBy(TASK* pTask, WindowAppTaskView* pView);
  130. // 执行对应的工具
  131. VPEnum::RETURN_VALUE ExecuteTool(ToolEvent* pToolEvent);
  132. // 给Task 发送执行指令
  133. void triggerTaskThread(ToolEvent* pToolEvent);
  134. // 2022-9-4 ToolEvent还可以同时触发Tool执行(目前只有Wait工具可以触发)
  135. void triggerToolExecution(ToolEvent* pToolEvent);
  136. // 处理本轮中涉及到绑定至复杂控件中的变量,包括全局变量、Pou内部变量等(向Runtime触发)
  137. // Reason:在所有Tool执行完一轮之后,需要检查一下Pou的内部变量是否有用做复杂控件的Index的,需要安排触发一下
  138. // Reason2:每轮Task执行完毕之后,也需要安排触发一下
  139. void syncComplexIndexToRuntime(QString strGroupName);
  140. // 2022-9-25 WaitTool专用,判断Wait工具是否需要等待某一个值,并且这个值是否已经命中
  141. bool isWaitToolHit(TOOL* pTool, ToolEvent* toolEvent);
  142. protected slots:
  143. // 接收来自接口的Event
  144. virtual void customEvent(QEvent* event) override;
  145. // void onEvent();
  146. void onEventTimer();
  147. private:
  148. static TaskManager* m_pTaskManager;
  149. QMap<QString, TASK*> m_Tasks; // 当前运行的所有Task
  150. QMap<QString, WindowAppTaskView*> m_TaskViews; // Task对应的界面指针
  151. QThreadPool m_TaskThreadPool; // 用于执行Task的线程池
  152. QTimer m_eventTimer; // 启动一个Timer模拟系统事件
  153. qint64 m_nTimerCounter; // 计数器,用来触发不同时间段的事件
  154. QMultiHash<EVENT_ID, TASK*> m_EventTasks; // 用于触发Task的event id和task的对应关系(一对多)
  155. QMultiHash<EVENT_ID, TOOL*> m_EventTools; // 2022-9-4,用于触发Tool执行的的event id和Tool的对应关系(一对多)
  156. QHash<TOOL*, ToolEvent*> m_ToolEvents; // 2022-9-5,保存Tool和ToolEvent的对应关系(目前用于在序列化时做查询使用)
  157. };