BaseDispatch.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778
  1. #include "pch.h"
  2. #include <YD_Public_OCC.h>
  3. #include "BaseDispatch.h"
  4. #include "GlobalVarDefine.h"
  5. #include "SubSys_RollBack_I.h"
  6. //构造函数
  7. CBaseDispatch::CBaseDispatch(void)
  8. {
  9. m_pQI_SendCmdsList = nullptr;
  10. m_pQI_SendGroupList = nullptr;
  11. m_pQI_SendRealList = nullptr;
  12. m_pFrmTool = nullptr;
  13. m_pNetWork = nullptr;
  14. m_pDebugModule = nullptr;
  15. m_pRedisClient = nullptr;
  16. m_pDispatchMngI = nullptr;
  17. m_pDataBaseOper = nullptr;
  18. m_EventF1ThreadTimeDur = -1;
  19. m_EventF2ThreadTimeDur = -1;
  20. m_EventBeginThreadTimeDur = -1;
  21. m_ObjectCPThreadTimeDur = -1;
  22. m_dInitTime = -1;
  23. m_bF1ThreadFinish = true;
  24. m_bF2ThreadFinish = true;
  25. m_bBeginThreadFinish = true;
  26. m_bObjectCPThreadFinish = true;
  27. m_dTaskStartTime = 0.;
  28. m_nRunLineID = -1;
  29. m_courseid = -1;
  30. InitDate();
  31. }
  32. //析构函数
  33. CBaseDispatch::~CBaseDispatch(void)
  34. {
  35. //ReleaseDate();
  36. if ( m_pDataBaseOper )
  37. {
  38. delete m_pDataBaseOper;
  39. m_pDataBaseOper = nullptr;
  40. }
  41. }
  42. /*******************************************************
  43. 函数名称: ReceiveMsg
  44. 函数功能: 接收网络消息
  45. 输入参数: NetCmd - 网络命令
  46. 输出参数: NULL
  47. 返 回 值: void
  48. *******************************************************/
  49. void CBaseDispatch::ReceiveMsg( OCCCOMMAND& NetCmd )
  50. {
  51. m_QI_GetCommands.push(NetCmd);
  52. }
  53. /*******************************************************
  54. 函数名称: OpenDB
  55. 函数功能: 打开数据库
  56. 输入参数: strIP - 数据库IP
  57. strBDname - 数据库名称
  58. struser - 用户名
  59. strpsw - 密码
  60. courseid - 课程号
  61. runlineid - 运营线路编号
  62. parm1 - 参数1
  63. parm2 - 参数2
  64. curseinfo - 课程初始化信息
  65. 输出参数: NULL
  66. 返 回 值: bool - true:成功 false:失败
  67. *******************************************************/
  68. bool CBaseDispatch::OpenDB( std::string Str_IP,std::string Str_Name,std::string Str_User
  69. ,std::string Str_Psw,int nCourseID,int nRunLineID,int nPara1
  70. ,int nPara2,int nDB_Type,InitCourInfo* pCourseInfo)
  71. {
  72. m_dTaskStartTime = GetNowTime(TIMEUNIT_S);
  73. pCourseInfo->startallinfo.begTime = nPara2;
  74. m_nRunLineID = nRunLineID;
  75. if ( !m_pDataBaseOper )
  76. {
  77. m_pDataBaseOper = new YD_DBOperator(nDB_Type);
  78. }
  79. if ( !m_pDataBaseOper )
  80. {
  81. OUT_LOG(LOG_LEVEL_NORMAL,"【M_%d,T_%d】构建数据库对象失败!!!\n",m_subsystype,m_trianid);
  82. return false;
  83. }
  84. if ( m_pDataBaseOper->ConnectDB(Str_IP,Str_User,Str_Psw,Str_Name) == 0 )
  85. {
  86. OUT_LOG(LOG_LEVEL_ERROR, "【M_%d,T_%d】打开数据库失败!!!\n",m_subsystype,m_trianid);
  87. return false;
  88. }
  89. else
  90. {
  91. OUT_LOG(LOG_LEVEL_NORMAL,"【M_%d,T_%d】打开数据库成功!!!\n",m_subsystype,m_trianid);
  92. }
  93. ReadCourInfo(nCourseID,nPara1,nPara2,pCourseInfo);
  94. OUT_LOG(LOG_LEVEL_NORMAL, "【M_%d,T_%d】应用数据读取开始!!!\n",m_subsystype,m_trianid);
  95. if (!InitSubSysDBDate(nCourseID,nPara1,nPara2,pCourseInfo))
  96. {
  97. OUT_LOG(LOG_LEVEL_ERROR, "【M_%d,T_%d】读取应用数据失败!!!\n",m_subsystype,m_trianid);
  98. return false;
  99. }
  100. else
  101. {
  102. OUT_LOG(LOG_LEVEL_NORMAL, "【M_%d,T_%d】读取应用数据成功!!!\n",m_subsystype,m_trianid);
  103. }
  104. return true;
  105. }
  106. /*******************************************************
  107. 函数名称: ReadCourInfo
  108. 函数功能: 读取课程信息
  109. 输入参数: nCourseID - 课程编号
  110. nPara1 - 参数1
  111. nPara2 - 参数2
  112. pCourseInfo - 初始化课程信息
  113. 输出参数: NULL
  114. 返 回 值: BOOL - TRUE:成功 FALSE:失败
  115. *******************************************************/
  116. BOOL CBaseDispatch::ReadCourInfo( int nCourseID,int nPara1,int nPara2,
  117. InitCourInfo* pCourseInfo )
  118. {
  119. BOOL bReadFlag = TRUE;
  120. m_curseinfo = *pCourseInfo;
  121. //TODO:更多公用课程信息可在此处理
  122. return bReadFlag;
  123. }
  124. /*******************************************************
  125. 函数名称: OpenWork
  126. 函数功能: 打开工作任务
  127. 输入参数: nTrainID - 训练号
  128. nSysType - 系统类型
  129. 输出参数: NULL
  130. 返 回 值: bool - true:成功 false:失败
  131. *******************************************************/
  132. bool CBaseDispatch::OpenWork( int nTrainID,int nSysType,
  133. CommandQueue* pTCPSendList,
  134. CommandQueue* pGroupSendList,
  135. CommandQueue* pUDPSendList )
  136. {
  137. m_trianid = nTrainID;
  138. m_subsystype = nSysType;
  139. if (!CreateWorkThread())
  140. {
  141. OUT_LOG(LOG_LEVEL_ERROR, "【M_%d,T_%d】调度任务开启工作线程失败",m_subsystype,m_trianid);
  142. return false;
  143. }
  144. else
  145. {
  146. OUT_LOG(LOG_LEVEL_NORMAL,"【M_%d,T_%d】调度任务开启工作线程成功!!!\n",m_subsystype,m_trianid);
  147. }
  148. if ( !pTCPSendList )
  149. {
  150. return false;
  151. }
  152. m_pQI_SendCmdsList = pTCPSendList;
  153. m_pQI_SendRealList = pUDPSendList;
  154. m_pQI_SendGroupList = pGroupSendList;
  155. if ( !InitInstance() )
  156. {
  157. OUT_LOG(LOG_LEVEL_ERROR,"【M_%d,T_%d】应用数据初始化失败!!!\n",m_subsystype,m_trianid);
  158. return false;
  159. }
  160. else
  161. {
  162. OUT_LOG(LOG_LEVEL_NORMAL,"【M_%d,T_%d】应用数据初始化成功!!!\n",m_subsystype,m_trianid);
  163. }
  164. OUT_LOG(LOG_LEVEL_NORMAL, "【M_%d,T_%d】调度任务开启工作成功",m_subsystype,m_trianid);
  165. m_dInitTime = GetNowTime(TIMEUNIT_S) - m_dTaskStartTime;
  166. return true;
  167. }
  168. /*******************************************************
  169. 函数名称: AddLogItem
  170. 函数功能: 添加日志条目
  171. 输入参数: strvalue - 日志文本
  172. Pri - 日志等级
  173. 输出参数: NULL
  174. 返 回 值: void
  175. *******************************************************/
  176. void CBaseDispatch::AddLogItem( std::string strvalue, int Pri )
  177. {
  178. if ( m_pFrmTool )
  179. {
  180. OUT_LOG(Pri, "【M_%d,T_%d】%s",m_subsystype,m_trianid,strvalue.c_str());
  181. }
  182. }
  183. /*******************************************************
  184. 函数名称: Excute_Sql
  185. 函数功能: 指定模块中执行SQL语句
  186. 输入参数: Str_Sql - SQL脚本
  187. 输出参数: NULL
  188. 返 回 值: void
  189. *******************************************************/
  190. void CBaseDispatch::Excute_Sql( std::string Str_Sql )
  191. {
  192. if ( m_pDataBaseOper && m_pDataBaseOper->isOpened() )
  193. {
  194. m_pDataBaseOper->DirectExecute(Str_Sql);
  195. }
  196. }
  197. /*******************************************************
  198. 函数名称: Exit
  199. 函数功能: 子系统退出
  200. 输入参数: NULL
  201. 输出参数: NULL
  202. 返 回 值: void
  203. *******************************************************/
  204. void CBaseDispatch::Exit()
  205. {
  206. m_RunStatus = DISPATCH_RUN_STATUS_STOP;
  207. Wait_AllThread_Finish(20);
  208. ReleaseDate();
  209. ExitInstance();
  210. Add_Module_Watch();
  211. if ( m_pDataBaseOper )
  212. {
  213. m_pDataBaseOper->CloseDB();
  214. }
  215. }
  216. /*******************************************************
  217. 函数名称: Dispatch_ModuleInit
  218. 函数功能: 调度模块初始化
  219. 输入参数: pDebugModule - 调试工具指针
  220. pNetWork - 网络工具指针
  221. 输出参数: NULL
  222. 返 回 值: void
  223. *******************************************************/
  224. void CBaseDispatch::Dispatch_ModuleInit( CDispatchMng_I* pDispatchMngI )
  225. {
  226. m_pDispatchMngI = pDispatchMngI;
  227. if ( m_pDispatchMngI )
  228. {
  229. m_pFrmTool = (CFrameTool_I*) m_pDispatchMngI->_IGetPtr_FrameTool();
  230. m_pNetWork = (CNetWorkMng_I*) m_pDispatchMngI->_IGetPtr_NetWorkModule();
  231. m_pDebugModule = (CDebug_Module_I*)m_pDispatchMngI->_IGetPtr_DebugModule();
  232. m_pRedisClient = (YD_RedisClient*) m_pDispatchMngI->_IGetPtr_RedisModule();
  233. }
  234. }
  235. /*******************************************************
  236. 函数名称: CreateWorkThread
  237. 函数功能: 创建工作线程
  238. 输入参数: NULL
  239. 输出参数: NULL
  240. 返 回 值: bool - true:成功 false:失败
  241. *******************************************************/
  242. bool CBaseDispatch::CreateWorkThread()
  243. {
  244. m_Thread_EventF1 = std::thread(std::bind(&CBaseDispatch::ThreadFun_EventF1, this));
  245. m_Thread_EventF2 = std::thread(std::bind(&CBaseDispatch::ThreadFun_EventF2, this));
  246. m_Thread_EventBegin = std::thread(std::bind(&CBaseDispatch::ThreadFun_EventBegin,this));
  247. m_Thread_ObjectCP = std::thread(std::bind(&CBaseDispatch::ThreadFun_ObjectCP, this));
  248. return true;
  249. }
  250. /*******************************************************
  251. 函数名称: ReleaseDate
  252. 函数功能: 释放数据
  253. 输入参数: NULL
  254. 输出参数: NULL
  255. 返 回 值: bool - true:成功 false:失败
  256. *******************************************************/
  257. bool CBaseDispatch::ReleaseDate()
  258. {
  259. m_EventF1ThreadOut = true;
  260. m_EventF2ThreadOut = true;
  261. m_EventBeginThreadOut = true;
  262. m_ObjectCPThreadOut = true;
  263. //1、F1线程退出
  264. if ( m_Thread_EventF1.joinable() )
  265. {
  266. m_Thread_EventF1.join();
  267. }
  268. //2、F2线程退出
  269. if ( m_Thread_EventF2.joinable() )
  270. {
  271. m_Thread_EventF2.join();
  272. }
  273. //3、实时计算线程退出
  274. if ( m_Thread_EventBegin.joinable() )
  275. {
  276. m_Thread_EventBegin.join();
  277. }
  278. //4、实时计算线程退出
  279. if ( m_Thread_ObjectCP.joinable() )
  280. {
  281. m_Thread_ObjectCP.join();
  282. }
  283. OUT_LOG(LOG_LEVEL_ERROR, "【M_%d,T_%d】调度任务清除资源",m_subsystype,m_trianid);
  284. return true;
  285. }
  286. /*******************************************************
  287. 函数名称: InitDate
  288. 函数功能: 初始化数据
  289. 输入参数: NULL
  290. 输出参数: NULL
  291. 返 回 值: bool - true:成功 false:失败
  292. *******************************************************/
  293. bool CBaseDispatch::InitDate()
  294. {
  295. m_trianid = 0;
  296. m_subsystype = 0;
  297. m_EventF1ThreadOut = true;
  298. m_EventF2ThreadOut = true;
  299. m_EventBeginThreadOut = true;
  300. m_ObjectCPThreadOut = true;
  301. m_RunStatus = DISPATCH_RUN_STATUS_STOP;
  302. m_QI_GetCommands.init(); //初始化接受表
  303. m_QI_GetCommands.setSafeCount(10000);
  304. std::string strTmp = Str_Format("系统类型:%d--接收队列",m_subsystype);
  305. m_QI_GetCommands.SetQueName(strTmp);
  306. _QI_eventF1List.init();
  307. _QI_eventF2List.init();
  308. m_pQI_SendCmdsList = nullptr;
  309. return true;
  310. }
  311. /*******************************************************
  312. 函数名称: Add_Module_Watch
  313. 函数功能: 添加模块监视数据
  314. 输入参数: NULL
  315. 输出参数: NULL
  316. 返 回 值: void
  317. *******************************************************/
  318. void CBaseDispatch::Add_Module_Watch()
  319. {
  320. if ( !m_pDebugModule ) return;
  321. SUB_MODULE SubModule;
  322. SubModule.nID = m_subsystype;
  323. SubModule.nStatus = m_RunStatus;
  324. SubModule.dTime_Init = m_dInitTime;
  325. SubModule.dTime_F1 = m_EventF1ThreadTimeDur;
  326. SubModule.dTime_F2 = m_EventF2ThreadTimeDur;
  327. SubModule.dTime_CP = m_ObjectCPThreadTimeDur;
  328. SubModule.dTime_Event = m_EventBeginThreadTimeDur;
  329. SubModule.bFinish_F1 = m_bF1ThreadFinish;
  330. SubModule.bFinish_F2 = m_bF2ThreadFinish;
  331. SubModule.bFinish_CP = m_bObjectCPThreadFinish;
  332. SubModule.bFinish_Event = m_bBeginThreadFinish;
  333. SubModule.nUDPSendCnt = (m_pQI_SendRealList ? m_pQI_SendRealList->GetCur_Count() :-1);
  334. SubModule.nUDPRecvCnt = (m_pDispatchMngI ? m_pDispatchMngI->_IGetCnt_RecvQue_UDP() :-1);
  335. SubModule.nTCPSendCnt = (m_pQI_SendCmdsList ? m_pQI_SendCmdsList->GetCur_Count() :-1);
  336. SubModule.nTCPRecvCnt = (m_pDispatchMngI ? m_pDispatchMngI->_IGetCnt_RecvQue_TCP() :-1);
  337. SubModule.nSelfRecvCnt = m_QI_GetCommands.GetCur_Count();
  338. m_pDebugModule->Update_SubModule(SubModule);
  339. }
  340. /*******************************************************
  341. 函数名称: RollBack_Prepare
  342. 函数功能: 回滚准备
  343. 输入参数: pRollBack - 回滚工具指针
  344. 输出参数: NULL
  345. 返 回 值: BOOL - TRUE:成功 FALSE:失败
  346. *******************************************************/
  347. BOOL CBaseDispatch::RollBack_Prepare( CRollBack_ITool* pRollBack )
  348. {
  349. //1、设置运行状态为暂停状态
  350. m_RunStatus = DISPATCH_RUN_STATUS_PAUSE;
  351. //2、等待全部线程计算完成
  352. if (!Wait_AllThread_Finish())
  353. {
  354. m_RunStatus = DISPATCH_RUN_STATUS_RUNNING;
  355. return FALSE;
  356. }
  357. //3、子模块做回滚准备
  358. BOOL bFlag = TRUE;
  359. for ( auto var : m_RollBackSysMap )
  360. {
  361. if (!var.second->RollBack_Prepare(pRollBack))
  362. {
  363. bFlag = FALSE;
  364. }
  365. }
  366. return bFlag;
  367. }
  368. /*******************************************************
  369. 函数名称: RollBack_Excute
  370. 函数功能: 回滚执行
  371. 输入参数: pRollBack - 回滚工具指针
  372. 输出参数: NULL
  373. 返 回 值: BOOL - TRUE:成功 FALSE:失败
  374. *******************************************************/
  375. BOOL CBaseDispatch::RollBack_Excute (CRollBack_ITool* pRollBack)
  376. {
  377. BOOL bFlag = TRUE;
  378. for ( auto var : m_RollBackSysMap )
  379. {
  380. if (!var.second->RollBack_Excute(pRollBack))
  381. {
  382. bFlag = FALSE;
  383. }
  384. }
  385. return bFlag;
  386. }
  387. /*******************************************************
  388. 函数名称: RollBack_Finish
  389. 函数功能: 回滚完成
  390. 输入参数: pRollBack - 回滚工具指针
  391. 输出参数: NULL
  392. 返 回 值: BOOL - TRUE:成功 FALSE:失败
  393. *******************************************************/
  394. BOOL CBaseDispatch::RollBack_Finish(CRollBack_ITool* pRollBack)
  395. {
  396. BOOL bFlag = TRUE;
  397. for ( auto var : m_RollBackSysMap )
  398. {
  399. if (!var.second->RollBack_Finish(pRollBack))
  400. {
  401. bFlag = FALSE;
  402. }
  403. }
  404. m_RunStatus = DISPATCH_RUN_STATUS_RUNNING;
  405. return bFlag;
  406. }
  407. /*******************************************************
  408. 函数名称: RollBack_Record
  409. 函数功能: 回滚记录
  410. 输入参数: pRollBack - 回滚工具指针
  411. 输出参数: NULL
  412. 返 回 值: BOOL - TRUE:成功 FALSE:失败
  413. *******************************************************/
  414. BOOL CBaseDispatch::RollBack_Record (CRollBack_ITool* pRollBack)
  415. {
  416. BOOL bFlag = TRUE;
  417. for ( auto var : m_RollBackSysMap )
  418. {
  419. if (!var.second->RollBack_Record(pRollBack))
  420. {
  421. bFlag = FALSE;
  422. }
  423. }
  424. return bFlag;
  425. }
  426. /*******************************************************
  427. 函数名称: Wait_AllThread_Finish
  428. 函数功能: 等待全部线程计算完成
  429. 输入参数: nTimeOut_T - 超时时间(秒)
  430. 输出参数: NULL
  431. 返 回 值: bool - true:成功 false:失败
  432. *******************************************************/
  433. bool CBaseDispatch::Wait_AllThread_Finish( int nTimeOut_T )
  434. {
  435. int nStartTime = (int)GetNowTime(TIMEUNIT_S);
  436. bool bFlag = ( m_bF1ThreadFinish &&
  437. m_bF2ThreadFinish &&
  438. m_bBeginThreadFinish &&
  439. m_bObjectCPThreadFinish );
  440. while ( !bFlag )
  441. {
  442. int nTempTime = (int)GetNowTime(TIMEUNIT_S);
  443. if ( nTempTime - nStartTime > nTimeOut_T ) //NOTE:超时直接返回
  444. {
  445. return false;
  446. }
  447. bFlag = ( m_bF1ThreadFinish &&
  448. m_bF2ThreadFinish &&
  449. m_bBeginThreadFinish &&
  450. m_bObjectCPThreadFinish);
  451. }
  452. return true;
  453. }
  454. /*******************************************************
  455. 函数名称: Send_TrainReset_Cmd
  456. 函数功能: 发送训练复位命令
  457. 输入参数: NULL
  458. 输出参数: NULL
  459. 返 回 值: bool - true:成功 false:失败
  460. *******************************************************/
  461. bool CBaseDispatch::Send_TrainReset_Cmd()
  462. {
  463. int nDesSysType = -1;
  464. switch ( m_subsystype )
  465. {
  466. case OCC_SYS_LS_SVR:
  467. nDesSysType = OCC_SYS_XD_CLIENT;
  468. break;
  469. case OCC_SYS_DD_SVR:
  470. nDesSysType = OCC_SYS_DD_CLIENT;
  471. break;
  472. case OCC_SYS_HD_SVR:
  473. nDesSysType = OCC_SYS_HD_CLIENT;
  474. break;
  475. default:
  476. break;
  477. }
  478. if ( nDesSysType < 0 || !m_pQI_SendCmdsList )
  479. {
  480. return false;
  481. }
  482. OCCCOMMAND NetCmd;
  483. NetCmd.ScrSysType = m_subsystype;
  484. NetCmd.DesSysType = nDesSysType;
  485. NetCmd.TrainningID = m_trianid;
  486. NetCmd.cmdType = OCCCOMMAND::eTrainReset;
  487. TRAIN_RESET Train_Reset;
  488. Train_Reset.nTrainingID = m_trianid;
  489. Train_Reset.nCourseID = m_courseid;
  490. Train_Reset.nType = eTrainReset_Type_RollBack;
  491. NetCmd.setPacketValue(&Train_Reset,NetCmd.cmdType);
  492. m_pQI_SendCmdsList->push(NetCmd);
  493. return true;
  494. }
  495. /*******************************************************
  496. 函数名称: Send_DispatchSys_OperR
  497. 函数功能: 发送调度系统操作记录
  498. 输入参数: NetCmd - 操作命令
  499. nResultCode - 操作结果
  500. 输出参数: NULL
  501. 返 回 值: bool - true:成功 false:失败
  502. *******************************************************/
  503. bool CBaseDispatch::Send_DispatchSys_OperR( OCCCOMMAND NetCmd,int nResultCode )
  504. {
  505. if ( !m_pQI_SendCmdsList || !m_pDispatchMngI )
  506. {
  507. return false;
  508. }
  509. if ( NetCmd.ScrSysType != OCC_SYS_XD_CLIENT
  510. && NetCmd.ScrSysType != OCC_SYS_DD_CLIENT
  511. && NetCmd.ScrSysType != OCC_SYS_HD_CLIENT
  512. && NetCmd.ScrSysType != 28 ) //IBP盘
  513. {
  514. return false;
  515. }
  516. DISPATCH_SYS_OPERRECORD DispatchSysOperR;
  517. DispatchSysOperR.nSrcSysID = NetCmd.ScrNetID;
  518. DispatchSysOperR.nSimTime = m_pDispatchMngI->_IGetTime_Simulate();
  519. DispatchSysOperR.nSysTime = GetSys_SecondTime_2();
  520. DispatchSysOperR.nDataLen = NetCmd.DateLen;
  521. DispatchSysOperR.nCmdType = NetCmd.cmdType;
  522. DispatchSysOperR.nCmdResult= nResultCode;
  523. int nDataSize = min((unsigned long)NetCmd.DateLen,sizeof(DispatchSysOperR.cCmdPara));
  524. memcpy(DispatchSysOperR.cCmdPara,&NetCmd.Net_MAX_MAXNETINFO,nDataSize);
  525. OCCCOMMAND NetCmd2;
  526. NetCmd2.DesSysType = OCC_SYS_XD_CLIENT;
  527. NetCmd2.ScrSysType = m_subsystype;
  528. NetCmd2.TrainningID = m_trianid;
  529. NetCmd2.cmdType = OCCCOMMAND::eDispatch_Sys_OperRecord;
  530. LPBASENETPACKET TmpPack = (LPBASENETPACKET)&DispatchSysOperR;
  531. NetCmd2.setPacketValue(TmpPack,NetCmd2.cmdType);
  532. m_pQI_SendCmdsList->push(NetCmd2);
  533. return true;
  534. }
  535. /*******************************************************
  536. 函数名称: ThreadFun_EventF1
  537. 函数功能: 线程函数_F1
  538. 输入参数: NULL
  539. 输出参数: NULL
  540. 返 回 值: void
  541. *******************************************************/
  542. void CBaseDispatch::ThreadFun_EventF1()
  543. {
  544. m_EventF1ThreadOut = false;
  545. try
  546. {
  547. while ( !m_EventF1ThreadOut )
  548. {
  549. NORMALCMDC cmd;
  550. double dTimeS = GetNowTime(TIMEUNIT_MS);
  551. if ( _QI_eventF1List.pop(cmd) )
  552. {
  553. EventF1Ass(cmd);
  554. m_EventF1ThreadTimeDur = GetNowTime(TIMEUNIT_MS) - dTimeS;
  555. }
  556. else
  557. {
  558. m_EventF1ThreadTimeDur = GetNowTime(TIMEUNIT_MS) - dTimeS;
  559. Thread_Sleep(TIMESPAN_LV_NORMAL);
  560. }
  561. }
  562. OUT_LOG(LOG_LEVEL_ERROR,"【M_%d,T_%d】调度任务TreadEventF1线程退出",m_subsystype,m_trianid);
  563. }
  564. catch (...)
  565. {
  566. OUT_LOG(LOG_LEVEL_ERROR, "TreadEventF1 Have a Error,Trainid = %d,TrainType= %d", \
  567. m_trianid,m_subsystype);
  568. }
  569. }
  570. /*******************************************************
  571. 函数名称: ThreadFun_EventF2
  572. 函数功能: 线程函数_F2
  573. 输入参数: NULL
  574. 输出参数: NULL
  575. 返 回 值: void
  576. *******************************************************/
  577. void CBaseDispatch::ThreadFun_EventF2()
  578. {
  579. m_EventF2ThreadOut = false;
  580. try
  581. {
  582. while ( !m_EventF2ThreadOut )
  583. {
  584. NORMALCMDC cmd;
  585. double dTimeS = GetNowTime(TIMEUNIT_MS);
  586. if ( _QI_eventF2List.pop(cmd) )
  587. {
  588. EventF2Ass(cmd);
  589. m_EventF2ThreadTimeDur = GetNowTime(TIMEUNIT_MS) - dTimeS;
  590. }
  591. else
  592. {
  593. m_EventF2ThreadTimeDur = GetNowTime(TIMEUNIT_MS) - dTimeS;
  594. Thread_Sleep(TIMESPAN_LVT);
  595. }
  596. }
  597. OUT_LOG(LOG_LEVEL_ERROR, "【M_%d,T_%d】调度任务TreadEventF2线程退出",m_subsystype,m_trianid);
  598. }
  599. catch (...)
  600. {
  601. OUT_LOG(LOG_LEVEL_ERROR, "TreadEventF2 Have a Error,Trainid = %d,TrainType= %d", \
  602. m_trianid,m_subsystype);
  603. }
  604. }
  605. /*******************************************************
  606. 函数名称: ThreadFun_EventBegin
  607. 函数功能: 线程函数_EventBegin
  608. 输入参数: NULL
  609. 输出参数: NULL
  610. 返 回 值: void
  611. *******************************************************/
  612. void CBaseDispatch::ThreadFun_EventBegin()
  613. {
  614. m_EventBeginThreadOut = false;
  615. try
  616. {
  617. time_t begintime = GetNowTime(TIMEUNIT_S);
  618. time_t lasttime = begintime;
  619. while (!m_EventBeginThreadOut)
  620. {
  621. double dTimeS = GetNowTime(TIMEUNIT_MS);
  622. time_t spantime = dTimeS - lasttime;
  623. if ( EventBeginAss(begintime,spantime) )
  624. {
  625. lasttime = GetNowTime(TIMEUNIT_S);
  626. m_EventBeginThreadTimeDur = GetNowTime(TIMEUNIT_MS) - dTimeS;
  627. }
  628. else
  629. {
  630. m_EventBeginThreadTimeDur = GetNowTime(TIMEUNIT_MS) - dTimeS;
  631. Thread_Sleep(TIMESPAN_LVT);
  632. }
  633. }
  634. OUT_LOG(LOG_LEVEL_ERROR,"【M_%d,T_%d】调度任务TreadEventBegin线程退出",m_subsystype,m_trianid);
  635. }
  636. catch (...)
  637. {
  638. OUT_LOG(LOG_LEVEL_ERROR, "TreadEventBegin Have a Error,Trainid = %d,TrainType= %d", \
  639. m_trianid,m_subsystype);
  640. }
  641. }
  642. /*******************************************************
  643. 函数名称: ThreadFun_ObjectCP
  644. 函数功能: 线程函数_ObjectCP
  645. 输入参数: NULL
  646. 输出参数: NULL
  647. 返 回 值: void
  648. *******************************************************/
  649. void CBaseDispatch::ThreadFun_ObjectCP()
  650. {
  651. m_ObjectCPThreadOut = false;
  652. double dThreadCalTime_CP = GetNowTime(TIMEUNIT_MS);
  653. try
  654. {
  655. //time_t begintime = CTime::GetCurrentTime().GetTime();
  656. time_t begintime = time(nullptr);
  657. time_t lasttime = GetNowTime(TIMEUNIT_S);
  658. while ( !m_ObjectCPThreadOut )
  659. {
  660. time_t spantime = GetNowTime(TIMEUNIT_S) - lasttime;
  661. Add_Module_Watch();
  662. double dTimeS = GetNowTime(TIMEUNIT_MS);
  663. double dDealT = GetNowTime(TIMEUNIT_MS) - dThreadCalTime_CP;
  664. if ( ObjectCPAss(begintime,spantime ) &&
  665. ( m_subsystype == OCC_SYS_XD_SVR || dDealT >= 1 ))
  666. {
  667. lasttime = GetNowTime(TIMEUNIT_S);
  668. dThreadCalTime_CP = GetNowTime(TIMEUNIT_MS);
  669. m_ObjectCPThreadTimeDur = GetNowTime(TIMEUNIT_MS) - dTimeS;
  670. }
  671. else
  672. {
  673. m_ObjectCPThreadTimeDur = GetNowTime(TIMEUNIT_MS) - dTimeS;
  674. Thread_Sleep(TIMESPAN_LV_NORMAL);
  675. }
  676. }
  677. OUT_LOG(LOG_LEVEL_ERROR,"【M_%d,T_%d】调度任务TreadObjectCP线程退出",m_subsystype,m_trianid);
  678. }
  679. catch (...)
  680. {
  681. OUT_LOG(LOG_LEVEL_ERROR, "TreadObjectCP Have a Error,Trainid = %d,TrainType= %d", \
  682. m_trianid,m_subsystype);
  683. }
  684. }