DispatchTaskManger.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  1. // DispatchTaskManger.cpp : 定义 DLL 的初始化例程。
  2. #include "pch.h"
  3. #include <YD_Public_OCC.h>
  4. #include "NetWork_Alone.h"
  5. #include "DispatchTaskManger.h"
  6. #if defined(_MSC_VER) || defined(WIN64) || defined(__WIN64__) || defined(WIN32) || defined(_WIN32)
  7. #ifdef _YD_OCC_DISPATCHTASK_MG_SDK
  8. #define _YD_OCC_DISPATCHTASK_MG_API __declspec(dllexport)
  9. #else
  10. #define _YD_OCC_DISPATCHTASK_MG_API __declspec(dllimport)
  11. #endif
  12. #else //linux
  13. #ifdef _YD_OCC_DISPATCHTASK_MG_SDK
  14. #define _YD_OCC_DISPATCHTASK_MG_API __attribute__ ((visibility("default")))
  15. #else
  16. #define _YD_OCC_DISPATCHTASK_MG_API __attribute__ ((visibility("default")))
  17. #endif
  18. #endif
  19. extern "C" _YD_OCC_DISPATCHTASK_MG_API CDispatchMng_I* CreateDispatchServer(CFrameTool_I * pFrmTool)
  20. {
  21. //1、直接返回-指针为空时
  22. CDispatchTaskMG* pDispatchMng = new CDispatchTaskMG();
  23. if ( !pDispatchMng ) return nullptr;
  24. //2、开始任务失败-析构对象并返回空
  25. if ( !(pDispatchMng->StartWork(pFrmTool)) )
  26. {
  27. delete pDispatchMng;
  28. pDispatchMng = nullptr;
  29. }
  30. return pDispatchMng;
  31. }
  32. //构造函数
  33. CDispatchTaskMG::CDispatchTaskMG( )
  34. {
  35. }
  36. //析构函数
  37. CDispatchTaskMG::~CDispatchTaskMG(void)
  38. {
  39. EXIT netoder;
  40. netoder.time = (int)time(nullptr);
  41. NetComand_Send(&netoder,OCC_SYS_SERVER_ADMIN,OCCCOMMAND::eExit);
  42. //1、首先关闭网络连接
  43. if ( m_pNetWork )
  44. {
  45. m_pNetWork->_IClose();
  46. delete m_pNetWork;
  47. m_pNetWork = nullptr;
  48. }
  49. //2、结束接收TCP数据线程
  50. m_ReceiveMsgThreadOut = true;
  51. if ( m_Thread_DealTCPData.joinable() )
  52. {
  53. m_Thread_DealTCPData.join();
  54. }
  55. //3、结束接收组播数据线程
  56. m_ReceiveGroupMsgThreadOut = true;
  57. if ( m_Thread_DealGroupData.joinable() )
  58. {
  59. m_Thread_DealGroupData.join();
  60. }
  61. //4、结束接收UDP数据线程
  62. m_ReceiveRealMsgThreadOut = true;
  63. if ( m_Thread_DealUDPData.joinable() )
  64. {
  65. m_Thread_DealUDPData.join();
  66. }
  67. //5、结束回滚记录线程
  68. m_RollBackRecordThreadOut = true;
  69. if ( m_Thread_RollBackRecord.joinable() )
  70. {
  71. m_Thread_RollBackRecord.join();
  72. }
  73. //6、删除训练
  74. DELTRAIN tb;
  75. tb.CourseID = 0;
  76. tb.SysID = OCC_SYS_LS_SVR;
  77. DeleteDispatchTask(tb.CourseID,tb.SysID,0);
  78. tb.CourseID = 0;
  79. tb.SysID = OCC_SYS_XD_SVR;
  80. DeleteDispatchTask(tb.CourseID,tb.SysID,0);
  81. tb.CourseID = 0;
  82. tb.SysID = OCC_SYS_DD_SVR;
  83. DeleteDispatchTask(tb.CourseID,tb.SysID,0);
  84. tb.CourseID = 0;
  85. tb.SysID = OCC_SYS_HD_SVR;
  86. DeleteDispatchTask(tb.CourseID,tb.SysID,0);
  87. tb.CourseID = 0;
  88. tb.SysID = OCC_SYS_KC_SVR;
  89. DeleteDispatchTask(tb.CourseID,tb.SysID,0);
  90. //7、各子模块停止任务并退出
  91. R_Mutex_LOCK(m_MutexDispatchTask);
  92. for( auto& var : m_DispatchTasksMap )
  93. {
  94. if ( var.second )
  95. {
  96. int ret;
  97. var.second->StopTask(ret);
  98. var.second->Exit();
  99. delete var.second;
  100. var.second = nullptr;
  101. }
  102. }
  103. m_DispatchTasksMap.clear();
  104. }
  105. /*******************************************************
  106. 函数名称: StartWork
  107. 函数功能: 开始工作
  108. 输入参数: pFrmTool - 框架工具
  109. 输出参数: NULL
  110. 返 回 值: void
  111. *******************************************************/
  112. bool CDispatchTaskMG::StartWork( CFrameTool_I* pFrmTool )
  113. {
  114. bool bFlag = CBaseDispatchTaskMg::StartWork(pFrmTool);
  115. m_pTCPSend_CallBack = pFrmTool->m_pTCPSend_CallBack;
  116. m_pUDPSend_CallBack = pFrmTool->m_pUDPSend_CallBack;
  117. //1、TODO:加载网络库
  118. if ( m_pTCPSend_CallBack && m_pUDPSend_CallBack )
  119. {
  120. m_pNetWork = new CNetWork_Alone(this);
  121. }
  122. else
  123. {
  124. NEW_NETWORK_INSTANCE NewInstanceFun = nullptr;
  125. #ifdef IN_WINDOWS
  126. std::string Str_LibName = GetFolder_Module_2() + "\\NetWorkManger.dll";
  127. HINSTANCE hInstance = ::LoadLibraryA(Str_LibName.c_str());
  128. NewInstanceFun = (NEW_NETWORK_INSTANCE)GetProcAddress(hInstance,"New_NetWork_Ins");
  129. #else
  130. std::string Str_LibName = GetFolder_Module_2() + "libNetWorkManger.so";
  131. HINSTANCE hInstance = dlopen(Str_LibName.c_str(),RTLD_LAZY);
  132. NewInstanceFun = (NEW_NETWORK_INSTANCE)dlsym(hInstance, "New_NetWork_Ins");
  133. #endif
  134. if ( NewInstanceFun )
  135. {
  136. m_pNetWork = NewInstanceFun(this);
  137. m_NetServerID = m_pNetWork->_IGet_System_ID();
  138. }
  139. }
  140. return bFlag;
  141. }
  142. /*******************************************************
  143. 函数名称: InitConfigParam
  144. 函数功能: 初始化配置参数
  145. 输入参数: NULL
  146. 输出参数: NULL
  147. 返回值 : bool - true:成功 false:失败
  148. *******************************************************/
  149. bool CDispatchTaskMG::InitConfigParam()
  150. {
  151. bool bFlag = true;
  152. for ( auto var : m_PluginMap )
  153. {
  154. int nSubSysType = var.first;
  155. if ( !LoadSubSys_DBConfig(nSubSysType) )
  156. {
  157. bFlag = false;
  158. }
  159. }
  160. return bFlag;
  161. }
  162. /*******************************************************
  163. 函数名称: LoadSubSys_DBConfig
  164. 函数功能: 加载子系统数据库配置文件
  165. 输入参数: nSubSysType - 子系统类型
  166. 输出参数: NULL
  167. 返回值 : BOOL - TRUE:成功 FALSE:失败
  168. *******************************************************/
  169. BOOL CDispatchTaskMG::LoadSubSys_DBConfig( int nSubSysType )
  170. {
  171. //1、先按网络配置设置默认数据库IP和NAME
  172. std::string Str_FilePath = GetFolder_Module_2();
  173. #ifdef IN_WINDOWS
  174. std::string Str_FileName = Str_FilePath+"\\YDComm.conf";
  175. #else
  176. std::string Str_FileName = Str_FilePath + "YDComm.conf";
  177. #endif
  178. std::string StrTmp = ReadCfg_String(Str_FileName, "DATABASE", "DatabaseAddr", "");
  179. vector <std::string> TmpVecStr = str_split_2(StrTmp, ";");
  180. int nDB_Type = TmpVecStr.size() > 3 ? atoi(TmpVecStr.at(3).c_str()) : 0;
  181. std::string Str_DefDBIP = TmpVecStr.size() >= 3 ? TmpVecStr.at(0) : "Error";
  182. std::string Str_DefDBName = TmpVecStr.size() >= 3 ? TmpVecStr.at(2) : "Error";
  183. std::string Str_DefUser = TmpVecStr.size() > 3 ? "yd_fms" : "yd_fms";
  184. std::string Str_Psw = nDB_Type == 1 ? "fms@123" : "fms";
  185. //2、设置子系统数据库配置关键Key
  186. char cMainKey[25];
  187. memset(cMainKey, 0, sizeof(cMainKey));
  188. switch (nSubSysType)
  189. {
  190. case OCC_SYS_LS_SVR:
  191. Str_To_CharBuf_2("LSDATABASE", cMainKey, 25);
  192. break;
  193. case OCC_SYS_XD_SVR:
  194. Str_To_CharBuf_2("XDDATABASE", cMainKey, 25);
  195. break;
  196. case OCC_SYS_DD_SVR:
  197. Str_To_CharBuf_2("DDDATABASE", cMainKey, 25);
  198. break;
  199. case OCC_SYS_HD_SVR:
  200. Str_To_CharBuf_2("HDDATABASE", cMainKey, 25);
  201. break;
  202. case OCC_SYS_JT_SVR:
  203. Str_To_CharBuf_2("XDDATABASE", cMainKey, 25);
  204. break;
  205. case OCC_SYS_KC_SVR:
  206. Str_To_CharBuf_2("KCDATABASE", cMainKey, 25);
  207. break;
  208. default:
  209. Str_To_CharBuf_2("XDDATABASE", cMainKey, 25);
  210. break;
  211. }
  212. //3、加载数据库配置文件
  213. #ifdef IN_WINDOWS
  214. Str_FileName = Str_FilePath + "\\ParamSetting.ini";
  215. #else
  216. Str_FileName = Str_FilePath + "ParamSetting.ini";
  217. #endif
  218. DATEBASECONFIG DataBaseConfig;
  219. DataBaseConfig.strSeverIP = ReadCfg_String(Str_FileName, cMainKey, "ServerIP", Str_DefDBIP);
  220. DataBaseConfig.strDBName = ReadCfg_String(Str_FileName, cMainKey, "DBname", Str_DefDBName);
  221. DataBaseConfig.strUserID = ReadCfg_String(Str_FileName, cMainKey, "Username", Str_DefUser);
  222. DataBaseConfig.strPassWord = ReadCfg_String(Str_FileName, cMainKey, "PassWord", Str_Psw);
  223. DataBaseConfig.nDB_Type = nDB_Type;
  224. //DataBaseConfig.strSeverIP.TrimLeft();
  225. //DataBaseConfig.strSeverIP.TrimRight();
  226. //DataBaseConfig.strDBName.TrimLeft();
  227. //DataBaseConfig.strDBName.TrimRight();
  228. //DataBaseConfig.strUserID.TrimLeft();
  229. //DataBaseConfig.strUserID.TrimRight();
  230. //DataBaseConfig.strPassWord.TrimLeft();
  231. //DataBaseConfig.strPassWord.TrimRight();
  232. //4、判断数据库配置正确性并存储配置文件
  233. if ( DataBaseConfig.strSeverIP == "Error" || DataBaseConfig.strSeverIP.empty())
  234. return FALSE;
  235. if ( DataBaseConfig.strDBName == "Error" || DataBaseConfig.strDBName.empty())
  236. return FALSE;
  237. if ( DataBaseConfig.strUserID == "Error" || DataBaseConfig.strUserID.empty())
  238. return FALSE;
  239. if ( DataBaseConfig.strPassWord == "Error" || DataBaseConfig.strPassWord.empty())
  240. return FALSE;
  241. //5、存储配置文件
  242. m_DataBaseConfigMap.insert(make_pair(nSubSysType,DataBaseConfig));
  243. return TRUE;
  244. }
  245. /*******************************************************
  246. 函数名称: CreateNewTaskType
  247. 函数功能: 创建新的任务类型
  248. 输入参数: nSysType - 系统类型
  249. 输出参数: NULL
  250. 返回值 : CBaseDispatch* - 创建的调度对象指针
  251. *******************************************************/
  252. CBaseDispatch* CDispatchTaskMG::CreateNewTaskType( int nSysType )
  253. {
  254. CBaseDispatch* pDispatchSys = NULL;
  255. //创建子模块
  256. sPlugin* pPlugin = GetPlugin_ByModuleID(nSysType);
  257. if ( pPlugin && pPlugin->bInitOk )
  258. {
  259. pDispatchSys = pPlugin->nCreatePlug();
  260. }
  261. //初始化调试工具
  262. if ( pDispatchSys )
  263. {
  264. pDispatchSys->Dispatch_ModuleInit(this);
  265. }
  266. return pDispatchSys;
  267. }
  268. void CDispatchTaskMG::Deal_NetComand( OCCCOMMAND& NetCmd )
  269. {
  270. if ( NetCmd.cmdType == OCCCOMMAND::eCreateConnect )
  271. {
  272. OCCORDER oder;
  273. oder.sysID = OCC_SYS_SERVER_SVR;
  274. oder.cmdType = OCC_NETMESSAGE_TRIAN_CREATETCP;
  275. oder.data1 = NetCmd.NET_JY_CREATECONNECT.SysType;
  276. oder.data2 = NetCmd.NET_JY_CREATECONNECT.SysID;
  277. oder.trainID = -1;
  278. NetComand_Send(&oder,OCC_SYS_SERVER_NET,OCCCOMMAND::eOccOrder);
  279. }
  280. if ( NetCmd.cmdType == OCCCOMMAND::CMD_SYS_ReConnec )
  281. {
  282. OCCORDER oder;
  283. oder.sysID = OCC_SYS_SERVER_SVR;
  284. oder.cmdType = OCC_NETMESSAGE_TRIAN_RESETNETROOM;
  285. oder.trainID = -1;
  286. NetComand_Send(&oder,OCC_SYS_SERVER_NET,OCCCOMMAND::eOccOrder);
  287. }
  288. }
  289. void CDispatchTaskMG::AddReceiveGroupMsg(int nTrainID, int nSysType, CBaseDispatch* pDispatchSys)
  290. {
  291. //NOTE:暂时先屏蔽此函数功能,觉得没什么用
  292. return;
  293. int nGroupSys = -1;
  294. switch (nSysType)
  295. {
  296. case OCC_SYS_XD_SVR:
  297. nGroupSys = OCC_SYS_XD_GROUP;
  298. break;
  299. case OCC_SYS_DD_SVR:
  300. nGroupSys = OCC_SYS_DD_GROUP;
  301. break;
  302. case OCC_SYS_HD_SVR:
  303. nGroupSys = OCC_SYS_HD_GROUP;
  304. break;
  305. default:
  306. break;
  307. }
  308. if ( nGroupSys <= 0 ) return;
  309. std::string Str_Key = Make2IntKey_2(nGroupSys,nTrainID);
  310. R_Mutex_LOCK(m_MutexDispatchTask);
  311. m_DispatchTasksMap.insert(make_pair(Str_Key,pDispatchSys));
  312. }
  313. /*******************************************************
  314. 函数名称: InitNetConnectStatus
  315. 函数功能: 初始化网络连接状态
  316. 输入参数: nTrainID - 训练号
  317. systype - 系统类型
  318. 输出参数: NULL
  319. 返回值 : CBaseDispatch* - 创建的调度对象指针
  320. *******************************************************/
  321. bool CDispatchTaskMG::InitNetConnectStatus( int nTrainID,int nSysType )
  322. {
  323. R_Mutex_LOCK(m_MutexTrainConect);
  324. auto iter = m_NetTrainNectMap.find(nTrainID);
  325. if ( iter != m_NetTrainNectMap.end() )
  326. {
  327. if ( iter->second.nSvrSysID_XD == m_NetServerID && nSysType == OCC_SYS_XD_SVR )
  328. {
  329. for ( size_t i = 0; i < iter->second.ClientSysID_XD.size(); i++ )
  330. {
  331. // OCCORDER oder;
  332. // oder.sysID = OCC_SYS_SERVER_SVR;
  333. // oder.cmdType = OCC_NETMESSAGE_TRIAN_CREATETCP;
  334. // oder.data1 = OCC_SYS_XD_CLIENT;
  335. // oder.data2 = iter->second.xdclientsysid[i];
  336. // oder.trainID = -1;
  337. // NetComand_Send(&oder,OCC_SYS_SERVER_NET,OCCCOMMAND::eOccOrder);
  338. }
  339. if ( iter->second.nSvrGroupID_XD > 0 )
  340. {
  341. OCCORDER oder;
  342. oder.sysID = OCC_SYS_SERVER_SVR;
  343. oder.cmdType = OCC_NETMESSAGE_TRIAN_JIONGROUP;
  344. oder.data1 = OCC_SYS_XD_GROUP;
  345. oder.data2 = iter->second.nSvrGroupID_XD;
  346. oder.trainID = nTrainID;
  347. NetComand_Send(&oder,OCC_SYS_SERVER_NET,OCCCOMMAND::eOccOrder);
  348. }
  349. }
  350. if ( iter->second.nSvrSysID_HD == m_NetServerID && nSysType == OCC_SYS_HD_SVR )
  351. {
  352. for (size_t i=0;i<iter->second.ClientSysID_HD.size();i++)
  353. {
  354. // OCCORDER oder;
  355. // oder.sysID = OCC_SYS_SERVER_SVR;
  356. // oder.cmdType = OCC_NETMESSAGE_TRIAN_CREATETCP;
  357. // oder.data1 = OCC_SYS_HD_CLIENT;
  358. // oder.data2 = iter->second.hdclientsysid[i];
  359. // oder.trainID = -1;
  360. // NetComand_Send(&oder,OCC_SYS_SERVER_NET,OCCCOMMAND::eOccOrder);
  361. }
  362. if ( iter->second.nSvrGroupID_HD > 0 )
  363. {
  364. OCCORDER oder;
  365. oder.sysID = OCC_SYS_SERVER_SVR;
  366. oder.cmdType = OCC_NETMESSAGE_TRIAN_JIONGROUP;
  367. oder.data1 = OCC_SYS_HD_GROUP;
  368. oder.data2 = iter->second.nSvrGroupID_HD;
  369. oder.trainID = nTrainID;
  370. NetComand_Send(&oder,OCC_SYS_SERVER_NET,OCCCOMMAND::eOccOrder);
  371. }
  372. }
  373. if ( iter->second.nSvrSysID_DD == m_NetServerID && nSysType == OCC_SYS_DD_SVR )
  374. {
  375. for ( size_t i = 0; i < iter->second.ClientSysID_DD.size(); i++ )
  376. {
  377. //OCCORDER oder;
  378. //oder.sysID = OCC_SYS_SERVER_SVR;
  379. //oder.cmdType = OCC_NETMESSAGE_TRIAN_CREATETCP;
  380. //oder.data1 = OCC_SYS_DD_CLIENT;
  381. //oder.data2 = iter->second.ddclientsysid[i];
  382. //oder.trainID = -1;
  383. //NetComand_Send(&oder,OCC_SYS_SERVER_NET,OCCCOMMAND::eOccOrder);
  384. }
  385. if ( iter->second.nSvrGroupID_DD > 0 )
  386. {
  387. OCCORDER oder;
  388. oder.sysID = OCC_SYS_SERVER_SVR;
  389. oder.cmdType = OCC_NETMESSAGE_TRIAN_JIONGROUP;
  390. oder.data1 = OCC_SYS_DD_GROUP;
  391. oder.data2 = iter->second.nSvrGroupID_DD;
  392. oder.trainID = nTrainID;
  393. NetComand_Send(&oder,OCC_SYS_SERVER_NET,OCCCOMMAND::eOccOrder);
  394. }
  395. }
  396. if ( iter->second.nSvrSysID_LS == m_NetServerID && nSysType == OCC_SYS_LS_SVR )
  397. {
  398. for ( size_t i = 0; i < iter->second.ClientSysID_XD.size(); i++ )
  399. {
  400. // OCCORDER oder;
  401. // oder.sysID = OCC_SYS_SERVER_SVR;
  402. // oder.cmdType = OCC_NETMESSAGE_TRIAN_CREATETCP;
  403. // oder.data1 = OCC_SYS_XD_CLIENT;
  404. // oder.data2 = iter->second.xdclientsysid[i];
  405. // oder.trainID = -1;
  406. // NetComand_Send(&oder,OCC_SYS_SERVER_NET,OCCCOMMAND::eOccOrder);
  407. }
  408. }
  409. if ( iter->second.nSvrSysID_HD > 0 )
  410. {
  411. }
  412. Thread_Sleep(100);
  413. return true;
  414. }
  415. return false;
  416. }
  417. void CDispatchTaskMG::DeleteReceiveGroupMsg( int nTrainID,int nSysType )
  418. {
  419. //1、按照系统类型查询组播号
  420. int nTmpGroupID = -1;
  421. switch ( nSysType )
  422. {
  423. case OCC_SYS_XD_SVR:
  424. nTmpGroupID = OCC_SYS_XD_GROUP;
  425. break;
  426. case OCC_SYS_DD_SVR:
  427. nTmpGroupID = OCC_SYS_DD_GROUP;
  428. break;
  429. case OCC_SYS_HD_SVR:
  430. nTmpGroupID = OCC_SYS_HD_GROUP;
  431. break;
  432. default:
  433. nTmpGroupID = -1;
  434. break;
  435. }
  436. //2、若查询组播号失败则直接返回
  437. if ( nTmpGroupID < 0 ) return;
  438. //3、查询并删除指定的组播
  439. string Str_Key = Make2IntKey_2(nTmpGroupID,nTrainID);
  440. R_Mutex_LOCK(m_MutexDispatchTask);
  441. auto iter = m_DispatchTasksMap.find(Str_Key);
  442. if ( iter != m_DispatchTasksMap.end() )
  443. {
  444. m_DispatchTasksMap.erase(iter);
  445. }
  446. }
  447. /*******************************************************
  448. 函数名称: _IGetPtr_CmdQueue
  449. 函数功能: 获取指定类型的数据队列
  450. 输入参数: nType - 类型
  451. 输出参数: NULL
  452. 返 回 值: LPVOID - 队列指针
  453. *******************************************************/
  454. LPVOID CDispatchTaskMG::_IGetPtr_CmdQueue( int nType )
  455. {
  456. CommandQueue* pCmdQueue = nullptr;
  457. switch ( nType )
  458. {
  459. case CmdQueueType_Send_TCP: //发送队列-TCP
  460. pCmdQueue = &m_QI_SendList_TCP;
  461. break;
  462. case CmdQueueType_Send_UDP: //发送队列-UDP
  463. pCmdQueue = &m_QI_SendList_UDP;
  464. break;
  465. case CmdQueueType_Send_GROUP: //发送队列-组播
  466. pCmdQueue = &m_QI_SendList_Group;
  467. break;
  468. case CmdQueueType_Recv_TCP: //接收队列-TCP
  469. pCmdQueue = &m_QI_GetList_TCP;
  470. break;
  471. case CmdQueueType_Recv_UDP: //接收队列-UDP
  472. pCmdQueue = &m_QI_GetList_UDP;
  473. break;
  474. case CmdQueueType_Recv_GROUP: //接收队列-组播
  475. pCmdQueue = &m_QI_GetList_Group;
  476. break;
  477. default:
  478. break;
  479. }
  480. return pCmdQueue;
  481. }
  482. BOOL CDispatchTaskMG::_ITCPData_2Server(char* pData, int nDateLen)
  483. {
  484. OCCCOMMAND NetCmd;
  485. int nSizeOff = 0;
  486. memcpy(&NetCmd.cmdType, pData + nSizeOff, sizeof(NetCmd.cmdType) ); nSizeOff += sizeof(NetCmd.cmdType);
  487. memcpy(&NetCmd.DesSysType, pData + nSizeOff, sizeof(NetCmd.DesSysType)); nSizeOff += sizeof(NetCmd.DesSysType);
  488. memcpy(&NetCmd.ScrSysType, pData + nSizeOff, sizeof(NetCmd.ScrSysType)); nSizeOff += sizeof(NetCmd.ScrSysType);
  489. memcpy(&NetCmd.DesNetID, pData + nSizeOff, sizeof(NetCmd.DesNetID) ); nSizeOff += sizeof(NetCmd.DesNetID);
  490. memcpy(&NetCmd.ScrNetID, pData + nSizeOff, sizeof(NetCmd.ScrNetID) ); nSizeOff += sizeof(NetCmd.ScrNetID);
  491. memcpy(&NetCmd.TrainningID, pData + nSizeOff, sizeof(NetCmd.TrainningID)); nSizeOff += sizeof(NetCmd.TrainningID);
  492. memcpy(&NetCmd.DateLen, pData + nSizeOff, sizeof(NetCmd.DateLen) ); nSizeOff += sizeof(NetCmd.DateLen) + 4;
  493. memcpy(&NetCmd.Net_CCTVCtrl_ToXD, pData + nSizeOff, NetCmd.DateLen);
  494. m_QI_GetList_TCP.push(NetCmd);
  495. return TRUE;
  496. }
  497. BOOL CDispatchTaskMG::_IUDPData_2Server(char* pData, int nDateLen)
  498. {
  499. OCCCOMMAND NetCmd;
  500. int nSizeOff = 0;
  501. memcpy(&NetCmd.cmdType, pData + nSizeOff, sizeof(NetCmd.cmdType)); nSizeOff += sizeof(NetCmd.cmdType);
  502. memcpy(&NetCmd.DesSysType, pData + nSizeOff, sizeof(NetCmd.DesSysType)); nSizeOff += sizeof(NetCmd.DesSysType);
  503. memcpy(&NetCmd.ScrSysType, pData + nSizeOff, sizeof(NetCmd.ScrSysType)); nSizeOff += sizeof(NetCmd.ScrSysType);
  504. memcpy(&NetCmd.DesNetID, pData + nSizeOff, sizeof(NetCmd.DesNetID)); nSizeOff += sizeof(NetCmd.DesNetID);
  505. memcpy(&NetCmd.ScrNetID, pData + nSizeOff, sizeof(NetCmd.ScrNetID)); nSizeOff += sizeof(NetCmd.ScrNetID);
  506. memcpy(&NetCmd.TrainningID, pData + nSizeOff, sizeof(NetCmd.TrainningID)); nSizeOff += sizeof(NetCmd.TrainningID);
  507. memcpy(&NetCmd.DateLen, pData + nSizeOff, sizeof(NetCmd.DateLen)); nSizeOff += sizeof(NetCmd.DateLen)+ 4;
  508. memcpy(&NetCmd.Net_CCTVCtrl_ToXD, pData + nSizeOff, NetCmd.DateLen);
  509. m_QI_GetList_UDP.push(NetCmd);
  510. return TRUE;
  511. }
  512. /*******************************************************
  513. 函数名称: _IAdd_Sub_Sys
  514. 函数功能: 添加子系统
  515. 输入参数: nTrainingID - 训练号
  516. nSysType - 系统类型
  517. nSysID - 系统号
  518. 输出参数: NULL
  519. 返 回 值: void
  520. *******************************************************/
  521. void CDispatchTaskMG::_IAdd_Sub_Sys(int nTrainingID, int nSysType, int nSysID)
  522. {
  523. RecTrianPosition(nSysType, nTrainingID, nSysID);
  524. }
  525. /*******************************************************
  526. 函数名称: _ISend_UDPData_ToModule
  527. 函数功能: 发送特殊UDP数据给模块
  528. 输入参数: nModuleID - 模块号
  529. lSysID - 系统号
  530. pDataBuf - 数据指针
  531. nLength - 数据长度
  532. 输出参数: NULL
  533. 返 回 值: BOOL - TRUE:成功 FALSE:失败
  534. *******************************************************/
  535. BOOL CDispatchTaskMG::_ISend_UDPData_ToModule( int nModuleID, long lSysID,
  536. char* pDataBuf,int nLength )
  537. {
  538. BOOL bFlag = FALSE;
  539. string Str_Index = Make2IntKey_2(nModuleID, m_nCurTrainID);
  540. R_Mutex_LOCK(m_MutexDispatchTask);
  541. auto itor = m_DispatchTasksMap.find(Str_Index);
  542. if ( itor != m_DispatchTasksMap.end() )
  543. {
  544. itor->second->DealWith_Special_UDPData(lSysID,pDataBuf,nLength);
  545. bFlag = TRUE;
  546. }
  547. return bFlag;
  548. }