CBaseDispatchTaskMg.cpp 46 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694
  1. #include "pch.h"
  2. #include <YD_Public_OCC.h>
  3. #include <YD_ExcelReader.h>
  4. #include "GlobalVarDefine.h"
  5. #include "NetMessageDefine.h"
  6. #include "CBaseDispatchTaskMg.h"
  7. #include <coding_conv.h>
  8. #define LOG_PER_LOG_MAX_LEN (1024*1) // 每条日志最大长度
  9. //构造函数
  10. CBaseDispatchTaskMg::CBaseDispatchTaskMg(void)
  11. {
  12. InitDate();
  13. m_pNetWork = nullptr;
  14. m_pDebugModule = nullptr;
  15. m_bRollBackEvent = FALSE;
  16. m_nCurTrainID = -1; //当前训练号
  17. m_nCurCourseID = -1; //当前课程号
  18. m_nCurRBPointID = 1; //当前回滚记录号
  19. m_NetServerID = -1; //服务器系统号
  20. m_TechServerID = -1; //教员系挺号
  21. m_nViewSysSvrID = -1; //协同服务器ID
  22. m_nAllTrainStatus = AllTrain_Status_Stop;
  23. m_nEndTrainingTime = -1; //结束训练时间
  24. m_nSysSimulateTime = -1; //系统仿真时间
  25. m_pFrmTool = nullptr; //框架工具接口
  26. //加载调试工具
  27. FunCreate_DebugModule CreateDebugModule = nullptr;
  28. #ifdef IN_WINDOWS
  29. std::string Str_Dll = GetFolder_Module_2() + "\\OCC.Public.DebugModule.dll";
  30. HINSTANCE hInstance2 = ::LoadLibraryA(Str_Dll.c_str());
  31. CreateDebugModule = (FunCreate_DebugModule)GetProcAddress(hInstance2, "Create_Instance");
  32. #else
  33. std::string Str_Dll = GetFolder_Module_2() + "Debug_Module.so";
  34. HINSTANCE hInstance2 = dlopen(Str_Dll.c_str(),RTLD_LAZY);
  35. CreateDebugModule = (FunCreate_DebugModule)dlsym(hInstance2,"Create_Instance");
  36. #endif
  37. if ( CreateDebugModule )
  38. {
  39. m_pDebugModule = (CDebug_Module_I*)CreateDebugModule();
  40. }
  41. m_pLogBuf = new char[LOG_PER_LOG_MAX_LEN];
  42. memset(m_cRollBackDes, 0, sizeof(m_cRollBackDes));
  43. //添加命令处理模块列表
  44. Add_AssignCmd_List(OCCCOMMAND::eMaincontrolEnvir, "10,17,12");
  45. Add_AssignCmd_List(OCCCOMMAND::eTSZoneWater_FeedBack, "17");
  46. Add_AssignCmd_List(OCCCOMMAND::eSys_ShijingXietong, "10,17");
  47. Add_AssignCmd_List(OCCCOMMAND::eUpdateTrain, "11,24");
  48. Add_AssignCmd_List(OCCCOMMAND::eTSViewSysCtrl_DHEqmpt, "12");
  49. }
  50. //析构函数
  51. CBaseDispatchTaskMg::~CBaseDispatchTaskMg(void)
  52. {
  53. if ( m_pDebugModule )
  54. {
  55. delete m_pDebugModule;
  56. m_pDebugModule = nullptr;
  57. }
  58. delete[]m_pLogBuf;
  59. }
  60. /*******************************************************
  61. 函数名称: StartWork
  62. 函数功能: 开始工作
  63. 输入参数: ...参数太多不想写了
  64. 输出参数: NULL
  65. 返 回 值: BOOL - TRUE:成功 FALSE:失败
  66. *******************************************************/
  67. bool CBaseDispatchTaskMg::StartWork( CFrameTool_I* pFrmTool )
  68. {
  69. m_pFrmTool = pFrmTool;
  70. //1、创建工作线程
  71. m_Thread_DealTCPData = std::thread(std::bind(&CBaseDispatchTaskMg::ThreadFun_DealTCPData, this));
  72. m_Thread_DealUDPData = std::thread(std::bind(&CBaseDispatchTaskMg::ThreadFun_DealUDPData, this));
  73. m_Thread_DealGroupData = std::thread(std::bind(&CBaseDispatchTaskMg::ThreadFun_DealGroupData, this));
  74. m_Thread_RollBackRecord = std::thread(std::bind(&CBaseDispatchTaskMg::ThreadFun_RollBackRecord,this));
  75. //2、加载子调度系统以及数据库配置文件
  76. LoadSub_DispatchSys();
  77. if ( !InitConfigParam() )
  78. {
  79. OUT_LOG(LOG_LEVEL_ERROR,"调度服务器初始化数据库配置失败");
  80. return FALSE;
  81. }
  82. //3、连接Redis数据库服务器
  83. int nResult = Start_Redis_Connect();
  84. if ( -1 == nResult )
  85. {
  86. OUT_LOG(LOG_LEVEL_ERROR,"Redis数据库连接失败");
  87. }
  88. STARTUP NetOrder;
  89. //NetOrder.time = (int)CTime::GetCurrentTime().GetTime();
  90. NetOrder.time = (int)time(nullptr);
  91. NetComand_Send(&NetOrder,OCC_SYS_SERVER_ADMIN,OCCCOMMAND::eStartUp);
  92. OUT_LOG(LOG_LEVEL_NORMAL, "调度服务器创建消息线程成功");
  93. return TRUE;
  94. }
  95. /*******************************************************
  96. 函数名称: NetComand_Send
  97. 函数功能: 网络命令发送
  98. 输入参数: pNetPack - 命令内容
  99. nDesSysType - 目标系统类型
  100. eCmdType - 命令类型
  101. nTrainID - 训练号
  102. 输出参数: NULL
  103. 返回值 : void
  104. *******************************************************/
  105. void CBaseDispatchTaskMg::NetComand_Send(LPBASENETPACKET pNetPack,
  106. int nDesSysType,
  107. OCCCOMMAND::CmdType eCmdType,
  108. int nTrainID)
  109. {
  110. OCCCOMMAND NetCmd;
  111. NetCmd.ScrSysType = OCC_SYS_SERVER_SVR;
  112. NetCmd.setPacketValue(pNetPack,eCmdType);
  113. NetCmd.TrainningID = nTrainID;
  114. NetCmd.DesSysType = nDesSysType;
  115. m_QI_SendList_TCP.push(NetCmd);
  116. }
  117. /*******************************************************
  118. 函数名称: Start_Redis_Connect
  119. 函数功能: 启动Redis数据库连接
  120. 输入参数: NULL
  121. 输出参数: NULL
  122. 返回值 : int - 连接结果:-1:失败 其他:成功
  123. *******************************************************/
  124. int CBaseDispatchTaskMg::Start_Redis_Connect()
  125. {
  126. #ifdef IN_WINDOWS
  127. std::string Str_FileName = GetFolder_Module_2() + "//RedisConfig.ini";
  128. #else
  129. std::string Str_FileName = GetFolder_Module_2() + "RedisConfig.ini";
  130. #endif
  131. std::string Str_IP = ReadCfg_String(Str_FileName,"REDISSERVER", "ServerIP", "127.0.0.1");
  132. int nPort = ReadCfg_Int (Str_FileName,"REDISSERVER", "ServerPort", 6379);
  133. int nResult = m_RedisClient.StartRedis(Str_IP, nPort);
  134. return nResult;
  135. }
  136. /*******************************************************
  137. 函数名称: InitDate
  138. 函数功能: 初始化数据
  139. 输入参数: NULL
  140. 输出参数: NULL
  141. 返回值 : void
  142. *******************************************************/
  143. void CBaseDispatchTaskMg::InitDate()
  144. {
  145. m_ReceiveMsgThreadOut = true; //线程退出-TCP数据
  146. m_ReceiveRealMsgThreadOut = true; //线程退出-UDP数据
  147. m_ReceiveGroupMsgThreadOut = true; //线程退出-组播数据
  148. m_RollBackRecordThreadOut = true; //线程退出-回滚记录
  149. m_dLastRecordTime = -1.0;
  150. m_QI_SendList_TCP.init();
  151. m_QI_SendList_TCP.setSafeCount(100000);
  152. m_QI_SendList_TCP.SetQueName("TCP发送队列");
  153. m_QI_GetList_TCP.init();
  154. m_QI_GetList_TCP.setSafeCount(10000);
  155. m_QI_GetList_TCP.SetQueName("TCP接收队列");
  156. m_QI_SendList_Group.init();
  157. m_QI_SendList_Group.setSafeCount(10000);
  158. m_QI_SendList_Group.SetQueName("组播发送队列");
  159. m_QI_GetList_Group.init();
  160. m_QI_GetList_Group.setSafeCount(10000);
  161. m_QI_GetList_Group.SetQueName("组播接收队列");
  162. m_QI_GetList_UDP.init();
  163. m_QI_GetList_UDP.setSafeCount(10000);
  164. m_QI_GetList_UDP.SetQueName("UDP接收队列");
  165. m_QI_SendList_UDP.init();
  166. m_QI_SendList_UDP.setSafeCount(10000);
  167. m_QI_SendList_UDP.SetQueName("UDP发送队列");
  168. }
  169. /*******************************************************
  170. 函数名称: NetComandToServer
  171. 函数功能: 处理发送给OCC总服务的网络命令
  172. 输入参数: NetCmd - 网络命令
  173. 输出参数: NULL
  174. 返回值 : bool - true:成功 false:失败
  175. *******************************************************/
  176. bool CBaseDispatchTaskMg::NetComandToServer( OCCCOMMAND& NetCmd )
  177. {
  178. //OUT_LOG(LOG_LEVEL_NORMAL,"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
  179. //OUT_LOG(LOG_LEVEL_NORMAL, "---------------------------课程管理开始!\n");
  180. try
  181. {
  182. if ( NetCmd.cmdType == OCCCOMMAND::eTrainIni )
  183. {
  184. if ( m_pNetWork )
  185. {
  186. m_pNetWork->_ISetTechID(NetCmd.ScrNetID);
  187. m_pNetWork->_ISetTrainID(NetCmd.TrainningID);
  188. m_TechServerID = NetCmd.ScrNetID;
  189. m_nCurTrainID = NetCmd.TrainningID;
  190. m_nCurRBPointID = 1;
  191. m_nCurCourseID = NetCmd.Net_JY_TrainIni.CourseID;
  192. m_pNetWork->_IRecord_Key_System(Record_SysType_TH, m_TechServerID);
  193. }
  194. TRAINEND te;
  195. te.CourseID = NetCmd.Net_JY_TrainIni.CourseID;
  196. te.SysID = NetCmd.Net_JY_TrainIni.SysType;
  197. OUT_LOG(LOG_LEVEL_NORMAL,"服务器收到eTrainEnd 消息:CourseID=%d,SysID=%d,TrianID=%d",te.CourseID,te.SysID,NetCmd.TrainningID);
  198. StopDispatchTask(te.CourseID,te.SysID, NetCmd.TrainningID);
  199. DELTRAIN tb;
  200. tb.CourseID = NetCmd.Net_JY_TrainIni.CourseID;
  201. tb.SysID = NetCmd.Net_JY_TrainIni.SysType;
  202. OUT_LOG(LOG_LEVEL_NORMAL,"服务器收到eTrainDel 消息:CourseID=%d,SysID=%d,TrianID=%d",tb.CourseID,tb.SysID,NetCmd.TrainningID);
  203. DeleteDispatchTask(tb.CourseID,tb.SysID, NetCmd.TrainningID);
  204. TRAININI& inc = NetCmd.Net_JY_TrainIni;
  205. InitCourInfo tmpcourseinfo;
  206. tmpcourseinfo.coursetype = NetCmd.cmdType;
  207. tmpcourseinfo.UniqueTrainingID = inc.UniqueTrainingID;
  208. OUT_LOG(LOG_LEVEL_NORMAL,"服务器收到eTrainIni 消息:CourseID=%d,SysType=%d,TrianID=%d,RunLineID=%d,SchalTimeID=%d,begTime=%d",inc.CourseID,inc.SysType,NetCmd.TrainningID,inc.RunLineID,inc.SchalTimeID,inc.begTime);
  209. CreateDispatchTask(inc.CourseID,inc.SysType, NetCmd.TrainningID
  210. ,inc.RunLineID,inc.SchalTimeID,inc.begTime,&tmpcourseinfo);
  211. }
  212. else if ( NetCmd.cmdType == OCCCOMMAND::eTrainEnd )
  213. {
  214. TRAINEND& te = NetCmd.Net_JY_TrainEnd;
  215. OUT_LOG(LOG_LEVEL_NORMAL,"服务器收到eTrainEnd 消息:CourseID=%d,SysID=%d,TrianID=%d",te.CourseID,te.SysID,NetCmd.TrainningID);
  216. StopDispatchTask(te.CourseID,te.SysID, NetCmd.TrainningID);
  217. Send_TrainEnd_2Client(NetCmd);
  218. }
  219. else if ( NetCmd.cmdType == OCCCOMMAND::eTrainBeg )
  220. {
  221. TRAINBEG& tb = NetCmd.Net_JY_TrainBeg;
  222. OUT_LOG(LOG_LEVEL_NORMAL,"服务器收到eTrainBeg 消息:CourseID=%d,SysID=%d,TrianID=%d",tb.CourseID,tb.SysID,NetCmd.TrainningID);
  223. RunDispatchTask(tb.CourseID,tb.SysID, NetCmd.TrainningID);
  224. Send_TrainBeg_2Client(NetCmd);
  225. }
  226. else if ( NetCmd.cmdType == OCCCOMMAND::eTrainDelete )
  227. {
  228. DELTRAIN& tb = NetCmd.Net_JY_TrainDel;
  229. OUT_LOG(LOG_LEVEL_NORMAL,"服务器收到eTrainDel 消息:CourseID=%d,SysID=%d,TrianID=%d",tb.CourseID,tb.SysID,NetCmd.TrainningID);
  230. DeleteDispatchTask(tb.CourseID,tb.SysID, NetCmd.TrainningID);
  231. }
  232. else if ( NetCmd.cmdType == OCCCOMMAND::eSetUserRoll )
  233. {
  234. TRAINSETUSERROLL& ur = NetCmd.Net_JY_TrainSetUserRoll;
  235. OUT_LOG(LOG_LEVEL_NORMAL,"服务器收到eSetUserRoll 消息:SysType=%d,TrianID=%d,NetID=%d",ur.SysType,NetCmd.TrainningID,ur.NetID);
  236. RecTrianPosition(ur.SysType, NetCmd.TrainningID,ur.NetID);
  237. }
  238. else if ( NetCmd.cmdType == OCCCOMMAND::eTrainDeleteAll )
  239. {
  240. TRAINDELALL& da = NetCmd.Net_JY_TrainiDelAll;
  241. OUT_LOG(LOG_LEVEL_NORMAL, "服务器收到删除所有命令!!!!消息:TrianID=%d!!!",da.TrianID);
  242. DeleteDispatchTask(0,OCC_SYS_XD_SVR,da.TrianID);
  243. DeleteDispatchTask(0,OCC_SYS_LS_SVR,da.TrianID);
  244. DeleteDispatchTask(0,OCC_SYS_DD_SVR,da.TrianID);
  245. DeleteDispatchTask(0,OCC_SYS_HD_SVR,da.TrianID);
  246. SVRREPLYMSG netret;
  247. memset(&netret,0,sizeof(netret));
  248. netret.status=OCC_NETMESSAGE_TRIAN_ALLDELETE_SUCCESS;
  249. NetComand_Send(&netret,OCC_SYS_SERVER_TH,OCCCOMMAND::eSvrReplyMsg,da.TrianID);//创建课程
  250. OUT_LOG(LOG_LEVEL_NORMAL, "删除成功!!!!!");
  251. }
  252. else if( NetCmd.cmdType == OCCCOMMAND::eTrainReStart )
  253. {
  254. TRAINDELALL& da = NetCmd.Net_JY_TrainiDelAll;
  255. OUT_LOG(LOG_LEVEL_NORMAL, "服务器收到删除所有命令!!!!消息:TrianID=%d!!!", da.TrianID);
  256. DeleteDispatchTask(0,OCC_SYS_XD_SVR,da.TrianID);
  257. DeleteDispatchTask(0,OCC_SYS_LS_SVR,da.TrianID);
  258. DeleteDispatchTask(0,OCC_SYS_DD_SVR,da.TrianID);
  259. DeleteDispatchTask(0,OCC_SYS_HD_SVR,da.TrianID);
  260. DeleteDispatchTask(0,OCC_SYS_JT_SVR,da.TrianID);
  261. SVRREPLYMSG netret;
  262. memset(&netret,0,sizeof(netret));
  263. netret.status = OCC_NETMESSAGE_TRIAN_ALLDELETE_SUCCESS;
  264. NetComand_Send(&netret,OCC_SYS_SERVER_TH,OCCCOMMAND::eSvrReplyMsg,da.TrianID);//创建课程
  265. OUT_LOG(LOG_LEVEL_NORMAL, "删除成功!!!!!");
  266. #ifdef IN_WINDOWS
  267. TCHAR szPath[256];
  268. GetModuleFileName(NULL,szPath,sizeof(szPath));
  269. TCHAR *szcmdline = GetCommandLine();
  270. STARTUPINFO StartUp;
  271. GetStartupInfo(&StartUp);
  272. PROCESS_INFORMATION info;
  273. BOOL bSuccessFlag = CreateProcess(szPath,szcmdline,NULL,NULL,FALSE,
  274. NORMAL_PRIORITY_CLASS,NULL,NULL,&StartUp,&info);
  275. if( bSuccessFlag )
  276. {
  277. ExitProcess(0);
  278. ::PostQuitMessage(0);
  279. }
  280. #endif
  281. }
  282. else if ( NetCmd.cmdType==OCCCOMMAND::eTrainStart )
  283. {
  284. TRAINSTART& ts = NetCmd.Net_JY_TrainiStart;
  285. OUT_LOG(LOG_LEVEL_NORMAL,"服务器收到eTrainStart 消息:CourseID=%d,TrianID=%d,RunLineID=%d,SchalTimeID=%d,begTime=%d",ts.CourseID,ts.TrianID,ts.RunLineID,ts.SchalTimeID,ts.begTime);
  286. InitCourInfo tmpcourseinfo;
  287. tmpcourseinfo.coursetype = OCCCOMMAND::eTrainStart;
  288. tmpcourseinfo.startallinfo = NetCmd.Net_JY_TrainiStart;
  289. if ( m_pNetWork )
  290. {
  291. m_pNetWork->_ISetTechID (NetCmd.ScrNetID );
  292. m_pNetWork->_ISetTrainID(NetCmd.TrainningID);
  293. }
  294. bool createflag = true;
  295. for ( int nIndex = 0; nIndex <100; nIndex++ )
  296. {
  297. int systype = ts.UserRoll[nIndex];
  298. nIndex++;
  299. int netid = ts.UserRoll[nIndex];
  300. if (systype > 0 && netid >= 0)
  301. {
  302. RecTrianPosition(systype,ts.TrianID,netid);
  303. Send_SetUserRoll_Cmd(netid);
  304. }
  305. else
  306. break;
  307. }
  308. for ( int count = 0; count < 5; count++ ) //初始化课程数据
  309. {
  310. if ( ts.SysType[count] > 0 )
  311. {
  312. if (!CreateDispatchTask(ts.CourseID,ts.SysType[count],ts.TrianID
  313. ,ts.RunLineID,ts.SchalTimeID,ts.begTime,&tmpcourseinfo))
  314. {
  315. createflag = false;
  316. }
  317. //有轨电车模块特殊处理
  318. //RunDispatchTask(ts.CourseID,ts.SysType[count],ts.TrianID);
  319. }
  320. else
  321. break;
  322. }
  323. for ( int count = 0; count < 5;count++ ) //运行课程
  324. {
  325. if ( ts.SysType[count] > 0 )
  326. {
  327. //CreateDispatchTask(ts.CourseID,ts.SysType[count],ts.TrianID,ts.RunLineID,ts.SchalTimeID,ts.begTime);
  328. if (!RunDispatchTask(ts.CourseID,ts.SysType[count],ts.TrianID))
  329. {
  330. createflag = false;
  331. }
  332. }
  333. else
  334. break;
  335. }
  336. if ( createflag == true )
  337. {
  338. SVRREPLYMSG netret;
  339. memset(&netret,0,sizeof(netret));
  340. netret.status=OCC_NETMESSAGE_TRIAN_ALLSTART_SUCCESS;
  341. NetComand_Send(&netret,OCC_SYS_SERVER_TH,OCCCOMMAND::eSvrReplyMsg,ts.TrianID);//创建课程
  342. OUT_LOG(LOG_LEVEL_NORMAL, "教员一键开始成功!!!");
  343. }
  344. else
  345. {
  346. SVRREPLYMSG netret;
  347. memset(&netret,0,sizeof(netret));
  348. netret.status=OCC_NETMESSAGE_TRIAN_ALLSTART_FAIL;
  349. NetComand_Send(&netret,OCC_SYS_SERVER_TH,OCCCOMMAND::eSvrReplyMsg,ts.TrianID);//创建课程
  350. OUT_LOG(LOG_LEVEL_NORMAL, "教员一键开始失败!!!");
  351. }
  352. OUT_LOG(LOG_LEVEL_NORMAL, "一键开课命令处理完毕!!!!!!");
  353. }
  354. else if ( NetCmd.cmdType == OCCCOMMAND::eTrainRollBackCtrl )
  355. {
  356. DealWith_RollBack_CtrlCmd(NetCmd);
  357. }
  358. else
  359. {
  360. Deal_NetComand(NetCmd);
  361. }
  362. }
  363. catch(...)
  364. {
  365. OUT_LOG(LOG_LEVEL_ERROR,"系统初始化失败!!!!!");
  366. }
  367. //OUT_LOG(LOG_LEVEL_NORMAL, "---------------------------课程管理结束!\n");
  368. //OUT_LOG(LOG_LEVEL_NORMAL, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
  369. return true;
  370. }
  371. /*******************************************************
  372. 函数名称: Send_TrainEnd_2Client
  373. 函数功能: 转发课程结束命令至客户端
  374. 输入参数: NetCmd - 原始命令
  375. 输出参数: NULL
  376. 返 回 值: void
  377. *******************************************************/
  378. bool CBaseDispatchTaskMg::Send_TrainEnd_2Client( OCCCOMMAND NetCmd )
  379. {
  380. int nType = NetCmd.Net_JY_TrainEnd.SysID;
  381. BOOL bSend = TRUE;
  382. switch (nType)
  383. {
  384. case OCC_SYS_XD_SVR:
  385. NetCmd.DesSysType = OCC_SYS_XD_CLIENT;
  386. break;
  387. case OCC_SYS_HD_SVR:
  388. NetCmd.DesSysType = OCC_SYS_HD_CLIENT;
  389. break;
  390. case OCC_SYS_DD_SVR:
  391. NetCmd.DesSysType = OCC_SYS_DD_CLIENT;
  392. break;
  393. default:
  394. bSend = FALSE;
  395. break;
  396. }
  397. if ( bSend )
  398. {
  399. m_QI_SendList_TCP.push(NetCmd);
  400. }
  401. return true;
  402. }
  403. /*******************************************************
  404. 函数名称: Send_TrainBeg_2Client
  405. 函数功能: 转发课程开始命令至客户端
  406. 输入参数: NetCmd - 原始命令
  407. 输出参数: NULL
  408. 返 回 值: void
  409. *******************************************************/
  410. bool CBaseDispatchTaskMg::Send_TrainBeg_2Client(OCCCOMMAND NetCmd)
  411. {
  412. int nType = NetCmd.Net_JY_TrainBeg.SysID;
  413. BOOL bSend = TRUE;
  414. switch (nType)
  415. {
  416. case OCC_SYS_XD_SVR:
  417. NetCmd.DesSysType = OCC_SYS_XD_CLIENT;
  418. break;
  419. case OCC_SYS_HD_SVR:
  420. NetCmd.DesSysType = OCC_SYS_HD_CLIENT;
  421. break;
  422. case OCC_SYS_DD_SVR:
  423. NetCmd.DesSysType = OCC_SYS_DD_CLIENT;
  424. break;
  425. default:
  426. bSend = FALSE;
  427. break;
  428. }
  429. if (bSend)
  430. {
  431. m_QI_SendList_TCP.push(NetCmd);
  432. }
  433. return true;
  434. }
  435. /*******************************************************
  436. 函数名称: Add_AssignCmd_List
  437. 函数功能: 添加命令分配列表
  438. 输入参数: nCmdType - 命令类型
  439. Str_ModuleList - 模块列表
  440. 输出参数: NULL
  441. 返 回 值: void
  442. *******************************************************/
  443. void CBaseDispatchTaskMg::Add_AssignCmd_List(int nCmdType, std::string Str_ModuleList)
  444. {
  445. ASSIGN_CMD AssignCmd;
  446. AssignCmd.nCmdType = nCmdType;
  447. vector<std::string> Vec_Temp = str_split_2(Str_ModuleList, ",");
  448. for ( size_t nIndex = 0; nIndex < Vec_Temp.size(); nIndex++ )
  449. {
  450. int nModuleID = atoi(Vec_Temp[nIndex].c_str());
  451. AssignCmd.VecModuleID.push_back(nModuleID);
  452. }
  453. m_AssignCmdMap.insert(std::make_pair(nCmdType,AssignCmd));
  454. }
  455. /*******************************************************
  456. 函数名称: MakeCmd_DealModule
  457. 函数功能: 生成命令处理模块列表
  458. 输入参数: NetCmd - 网络命令
  459. 输出参数: VecModuleID - 命令处理模块列表
  460. 返 回 值: void
  461. *******************************************************/
  462. void CBaseDispatchTaskMg::MakeCmd_DealModule(OCCCOMMAND NetCmd, vector<int>& VecModuleID)
  463. {
  464. int nCmdType = NetCmd.cmdType;
  465. auto itor = m_AssignCmdMap.find(nCmdType);
  466. if ( itor != m_AssignCmdMap.end() )
  467. {
  468. VecModuleID = itor->second.VecModuleID;
  469. }
  470. else
  471. {
  472. VecModuleID.push_back(NetCmd.DesSysType);
  473. }
  474. }
  475. /*******************************************************
  476. 函数名称: AssignCmd_ToModule
  477. 函数功能: 分发网络命令至处理模块
  478. 输入参数: NetCmd - 网络命令
  479. VecModuleID - 命令模块列表
  480. 输出参数: NULL
  481. 返 回 值: void
  482. *******************************************************/
  483. BOOL CBaseDispatchTaskMg::AssignCmd_ToModule(OCCCOMMAND NetCmd, vector<int> VecModuleID)
  484. {
  485. BOOL bFlag = FALSE;
  486. R_Mutex_LOCK(m_MutexDispatchTask);
  487. for ( size_t nIndex = 0; nIndex < VecModuleID.size(); nIndex++ )
  488. {
  489. string Str_Key = Make2IntKey_2(VecModuleID[nIndex],NetCmd.TrainningID);
  490. auto iter = m_DispatchTasksMap.find(Str_Key);
  491. if ( iter != m_DispatchTasksMap.end() )
  492. {
  493. CBaseDispatch* pDispatchSys = iter->second;
  494. if ( pDispatchSys )
  495. {
  496. pDispatchSys->ReceiveMsg(NetCmd);
  497. bFlag = TRUE;
  498. }
  499. }
  500. }
  501. return bFlag;
  502. }
  503. /*******************************************************
  504. 函数名称: NetComand_Receive
  505. 函数功能: 网络命令接收-处理+分发
  506. 输入参数: NetCmd - 网络命令
  507. 输出参数: NULL
  508. 返回值 : bool - true:成功 false:失败
  509. *******************************************************/
  510. bool CBaseDispatchTaskMg::NetComand_Receive( OCCCOMMAND NetCmd )
  511. {
  512. //1、数据只需要在服务端实现数据转发
  513. switch (NetCmd.cmdType)
  514. {
  515. case OCCCOMMAND::eTelephoneTalkRecord: //通话记录协议
  516. case OCCCOMMAND::eTelephoneSpeechRecognize: //通话语音识别
  517. case OCCCOMMAND::eTelephone_Session: //语音电话_会话
  518. case OCCCOMMAND::eTelephone_Intercom: //语音电话_对讲
  519. {
  520. NetCmd.DesNetID = -1;
  521. NetCmd.ScrSysType = OCC_SYS_XD_SVR;
  522. NetCmd.DesSysType = OCC_SYS_XD_CLIENT;
  523. m_QI_SendList_TCP.push(NetCmd);
  524. return true;
  525. }
  526. break;
  527. }
  528. //2、处理并分发网络数据
  529. if ( NetCmd.DesSysType == OCC_SYS_SERVER_SVR )
  530. {
  531. return NetComandToServer(NetCmd);
  532. }
  533. else
  534. {
  535. //<1>、存储协同服务器编号
  536. if ( NetCmd.cmdType == OCCCOMMAND::eSys_ShijingXietong && m_pNetWork )
  537. {
  538. m_nViewSysSvrID = NetCmd.ScrNetID;
  539. m_pNetWork->_IRecord_Key_System(Record_SysType_View, m_nViewSysSvrID);
  540. }
  541. //<2>、生成命令处理模块ID
  542. vector<int> VecModuleID;
  543. MakeCmd_DealModule( NetCmd, VecModuleID );
  544. //<3>、将数据分发给各子模块
  545. AssignCmd_ToModule( NetCmd, VecModuleID );
  546. }
  547. return false;
  548. }
  549. /*******************************************************
  550. 函数名称: CreateDispatchTask
  551. 函数功能: 创建调度任务
  552. 输入参数: courseid - 课程号
  553. systype - 系统类型
  554. trainid - 训练号
  555. runlineid - 运营线路编号
  556. parm1 -
  557. parm2 -
  558. curseinfo - 课程信息
  559. 输出参数: NULL
  560. 返回值 : bool - true:成功 false:失败
  561. *******************************************************/
  562. bool CBaseDispatchTaskMg::CreateDispatchTask( int courseid,int systype,int trainid
  563. ,int runlineid,int parm1,int parm2
  564. ,InitCourInfo* curseinfo )
  565. {
  566. m_nAllTrainStatus = AllTrain_Status_Init;
  567. if ( m_pNetWork && systype == OCC_SYS_XD_SVR )
  568. {
  569. int nSimNumberTime = parm2 / 3600 * 10000 + parm2 % 3600 / 60 * 100 + parm2 % 60;
  570. m_pNetWork->_IStart_Training(m_nCurTrainID, m_nCurCourseID, nSimNumberTime);
  571. m_pNetWork->_IRecord_Training_Sys(Record_SysType_XD);
  572. m_pNetWork->_IRecord_Training_Sys(Record_SysType_DD);
  573. m_pNetWork->_IRecord_Training_Sys(Record_SysType_HD);
  574. }
  575. SVRREPLYMSG netret;
  576. memset(&netret,0,sizeof(netret));
  577. netret.sysType = systype;
  578. bool ret = true;
  579. netret.status=OCC_NETMESSAGE_TRIAN_CREATE_FAIL;
  580. string key = Make2IntKey_2(systype,trainid);
  581. R_Mutex_LOCK(m_MutexDispatchTask);
  582. auto iter = m_DispatchTasksMap.find(key);
  583. if ( iter == m_DispatchTasksMap.end() )
  584. {
  585. CBaseDispatch* pdispatchsys = CreateNewTaskType(systype);
  586. if ( !pdispatchsys )
  587. {
  588. OUT_LOG(LOG_LEVEL_ERROR,"调度服务器创建: %s 训练号:%d 失败",GetSysTypeStr(systype).c_str(),trainid);
  589. ret = false;
  590. netret.status = OCC_NETMESSAGE_TRIAN_CREATE_FAIL;
  591. }
  592. else
  593. {
  594. RecTrianPosition(systype,trainid,m_NetServerID);
  595. auto iter = m_DataBaseConfigMap.find(systype);
  596. if ( iter == m_DataBaseConfigMap.end() )
  597. {
  598. OUT_LOG(LOG_LEVEL_ERROR,"调度服务器创建: %s 训练号:%d 没有找到数据库配置项",GetSysTypeStr(systype).c_str(), trainid);
  599. ret = false;
  600. netret.status = OCC_NETMESSAGE_TRIAN_CREATE_FAIL;
  601. }
  602. else if (!pdispatchsys->OpenDB(iter->second.strSeverIP,iter->second.strDBName
  603. ,iter->second.strUserID,iter->second.strPassWord,courseid,runlineid,parm1,parm2,iter->second.nDB_Type,curseinfo))
  604. {
  605. pdispatchsys->Exit();
  606. delete pdispatchsys;
  607. pdispatchsys=NULL;
  608. OUT_LOG(LOG_LEVEL_ERROR,"调度服务器创建: %s 训练号:%d 打开数据库任务失败",GetSysTypeStr(systype).c_str(), trainid);
  609. ret=false;
  610. netret.status=OCC_NETMESSAGE_TRIAN_CREATE_FAIL;
  611. }
  612. else if (!pdispatchsys->OpenWork(trainid,systype,&m_QI_SendList_TCP,&m_QI_SendList_Group,&m_QI_SendList_UDP))
  613. {
  614. pdispatchsys->Exit();
  615. delete pdispatchsys;
  616. pdispatchsys = NULL;
  617. OUT_LOG(LOG_LEVEL_ERROR, "调度服务器创建: %s 训练号:%d 失败", GetSysTypeStr(systype).c_str(), trainid);
  618. ret=false;
  619. netret.status = OCC_NETMESSAGE_TRIAN_CREATE_FAIL;
  620. }
  621. else
  622. {
  623. m_DispatchTasksMap.insert(make_pair(key,pdispatchsys));
  624. OUT_LOG(LOG_LEVEL_NORMAL, "调度服务器创建: %s 训练号:%d 成功", GetSysTypeStr(systype).c_str(), trainid);
  625. netret.status = OCC_NETMESSAGE_TRIAN_CREATE_SUCCESS;
  626. R_Mutex_LOCK(m_MutexTrainConect);
  627. NETTRIANNECTMAP::iterator iter = m_NetTrainNectMap.find(trainid);
  628. if ( iter == m_NetTrainNectMap.end() )
  629. {
  630. NETTRIANDISTRI nettrian;
  631. nettrian.nTrainingID = trainid;
  632. nettrian.nTrainStartTime = parm2;
  633. m_NetTrainNectMap.insert(make_pair(trainid,nettrian));
  634. }
  635. else
  636. {
  637. iter->second.nTrainStartTime = parm2;
  638. }
  639. AddReceiveGroupMsg(trainid,systype,pdispatchsys);
  640. }
  641. }
  642. }
  643. else
  644. {
  645. OUT_LOG(LOG_LEVEL_ERROR,"调度服务器创建: %s 训练号:%d 失败! 该训练已经存在", GetSysTypeStr(systype).c_str(), trainid);
  646. netret.status = OCC_NETMESSAGE_TRIAN_CREATE_EXIST;
  647. }
  648. Str_To_CharBuf_2("",netret.ReplyText,ALARM_LEN);
  649. //if (curseinfo->coursetype == OCCCOMMAND::eTrainIni) //适应老程序特殊处理
  650. //{
  651. // memcpy(&netret,&systype,sizeof(int));
  652. // int tmpstatus = OCC_NETMESSAGE_TRIAN_CREATE_SUCCESS;
  653. // memcpy((char*)(&netret)+ sizeof(int),&tmpstatus,sizeof(int));
  654. // /*netret.sysType = systype;
  655. // netret.status=OCC_NETMESSAGE_TRIAN_CREATE_SUCCESS;*/
  656. //}
  657. if ( curseinfo->coursetype == OCCCOMMAND::eTrainIni && m_pNetWork) //其他流程单独发送
  658. {
  659. //NetComand_Send(&netret,OCC_SYS_SERVER_TH,OCCCOMMAND::eSvrReplyMsg,trainid);//创建课程
  660. //修改为立即发送
  661. OCCCOMMAND NetCmd;
  662. NetCmd.cmdType = OCCCOMMAND::eSvrReplyMsg;
  663. NetCmd.DesSysType = OCC_SYS_SERVER_TH;
  664. NetCmd.ScrSysType = OCC_SYS_SERVER_SVR;
  665. NetCmd.DesNetID = m_TechServerID;
  666. NetCmd.TrainningID = trainid;
  667. NetCmd.DateLen = sizeof(SVRREPLYMSG);
  668. NetCmd.setPacketValue(&netret,OCCCOMMAND::eSvrReplyMsg);
  669. m_pNetWork->_ISend_TCPData_RightNow(NetCmd);
  670. }
  671. return ret;
  672. }
  673. /*******************************************************
  674. 函数名称: DeleteDispatchTask
  675. 函数功能: 删除调度任务
  676. 输入参数: nCourseID - 课程号
  677. nSysType - 系统类型
  678. nTrainID - 训练号
  679. 输出参数: NULL
  680. 返回值 : bool - true:成功 false:失败
  681. *******************************************************/
  682. bool CBaseDispatchTaskMg::DeleteDispatchTask( int nCourseID, int nSysType, int nTrainID )
  683. {
  684. bool returnflag = false;
  685. SVRREPLYMSG netret;
  686. netret.sysType = nSysType;
  687. netret.status = OCC_NETMESSAGE_TRIAN_DELETE_SUCCESS;
  688. BOOL bFindFlag = FALSE;
  689. R_Mutex_LOCK(m_MutexDispatchTask);
  690. for ( auto iter = m_DispatchTasksMap.begin(); iter != m_DispatchTasksMap.end(); )
  691. {
  692. CBaseDispatch* pDispatchSys = iter->second;
  693. if ( !pDispatchSys )
  694. {
  695. m_DispatchTasksMap.erase(iter);
  696. return false;
  697. }
  698. else
  699. {
  700. if ( pDispatchSys->m_subsystype != nSysType )
  701. {
  702. iter ++;
  703. continue;
  704. }
  705. else
  706. {
  707. nCourseID= pDispatchSys->m_courseid;
  708. nSysType = pDispatchSys->m_subsystype;
  709. nTrainID = pDispatchSys->m_trianid;
  710. }
  711. }
  712. //行调训练结束后取结束时间
  713. if ( nSysType == OCC_SYS_XD_SVR )
  714. {
  715. m_nEndTrainingTime = pDispatchSys->GetSim_NumberTime();
  716. }
  717. bFindFlag = TRUE;
  718. if ( pDispatchSys->StopTask(netret.parm) )
  719. {
  720. returnflag = true;
  721. pDispatchSys->Exit();
  722. DeleteReceiveGroupMsg(nTrainID, nSysType);
  723. //Sleep(1000);
  724. delete pDispatchSys;
  725. pDispatchSys = NULL;
  726. netret.status = OCC_NETMESSAGE_TRIAN_DELETE_SUCCESS;
  727. OUT_LOG(LOG_LEVEL_ERROR,"调度服务器删除: %s 训练号:%d 成功",GetSysTypeStr(nSysType).c_str(),nTrainID);
  728. //DISTASKMAP::iterator tmpiter = iter;
  729. m_DispatchTasksMap.erase(iter);
  730. if ( nSysType == OCC_SYS_XD_SVR )
  731. {
  732. R_Mutex_LOCK(m_MutexTrainConect);
  733. auto iter = m_NetTrainNectMap.find(nTrainID);
  734. if ( iter != m_NetTrainNectMap.end() )
  735. {
  736. m_NetTrainNectMap.erase(iter);
  737. }
  738. }
  739. iter = m_DispatchTasksMap.begin();
  740. }
  741. else
  742. netret.status = OCC_NETMESSAGE_TRIAN_DELETE_FAIL;
  743. }
  744. if( !bFindFlag )
  745. {
  746. netret.status = OCC_NETMESSAGE_TRIAN_DELETE_CANNOETFIND;
  747. }
  748. NetComand_Send(&netret,OCC_SYS_SERVER_TH,OCCCOMMAND::eSvrReplyMsg, nTrainID);
  749. if ( m_pDebugModule && m_pNetWork &&
  750. (int)m_DispatchTasksMap.size() == 0 )
  751. {
  752. if ( bFindFlag )
  753. {
  754. m_pNetWork->_IEnd_Training(m_nCurTrainID, m_nCurCourseID,m_nEndTrainingTime);
  755. m_nCurTrainID = -1;
  756. m_nCurRBPointID = 1;
  757. m_nViewSysSvrID = -1;
  758. }
  759. m_pDebugModule->Reset_Debug_Tool();
  760. m_nAllTrainStatus = AllTrain_Status_Stop;
  761. }
  762. return returnflag ;
  763. }
  764. /*******************************************************
  765. 函数名称: StopDispatchTask
  766. 函数功能: 停止调度任务
  767. 输入参数: nCourseID - 课程号
  768. nSysType - 系统类型
  769. nTrainID - 训练号
  770. 输出参数: NULL
  771. 返回值 : bool - true:成功 false:失败
  772. *******************************************************/
  773. bool CBaseDispatchTaskMg::StopDispatchTask( int nCourseID,int nSysType,int nTrainID )
  774. {
  775. SVRREPLYMSG netret;
  776. netret.sysType = nSysType;
  777. netret.status = OCC_NETMESSAGE_TRIAN_STOP_SUCCESS;
  778. string Str_Key = Make2IntKey_2(nSysType, nTrainID);
  779. R_Mutex_LOCK(m_MutexDispatchTask);
  780. auto iter = m_DispatchTasksMap.find(Str_Key);
  781. if ( iter != m_DispatchTasksMap.end() )
  782. {
  783. //1、找不到子系统时直接返回
  784. CBaseDispatch* pDispatchSys = iter->second;
  785. if ( !pDispatchSys )
  786. {
  787. m_DispatchTasksMap.erase(iter);
  788. return false;
  789. }
  790. //2、找到系统后停止子系统的计算
  791. if ( pDispatchSys->StopTask(netret.parm) )
  792. {
  793. netret.status = OCC_NETMESSAGE_TRIAN_STOP_SUCCESS;
  794. }
  795. else
  796. {
  797. netret.status = OCC_NETMESSAGE_TRIAN_STOP_FAIL;
  798. }
  799. }
  800. else
  801. {
  802. netret.status=OCC_NETMESSAGE_TRIAN_STOP_CANNOETFIND;
  803. }
  804. //反馈停止任务结果给教员系统
  805. NetComand_Send(&netret,OCC_SYS_SERVER_TH,OCCCOMMAND::eSvrReplyMsg, nTrainID);
  806. return true;
  807. }
  808. /*******************************************************
  809. 函数名称: PauseDispatchTask
  810. 函数功能: 暂停调度任务
  811. 输入参数: nCourseID - 课程号
  812. nSysType - 系统类型
  813. nTrainID - 训练号
  814. 输出参数: NULL
  815. 返回值 : bool - true:成功 false:失败
  816. *******************************************************/
  817. bool CBaseDispatchTaskMg::PauseDispatchTask( int nCourseID,int nSysType,int nTrainID )
  818. {
  819. SVRREPLYMSG netret;
  820. netret.sysType = nSysType;
  821. netret.status = OCC_NETMESSAGE_TRIAN_PAUSE_SUCCESS;
  822. string Str_Key = Make2IntKey_2(nSysType, nTrainID);
  823. R_Mutex_LOCK(m_MutexDispatchTask);
  824. auto iter = m_DispatchTasksMap.find(Str_Key);
  825. if ( iter != m_DispatchTasksMap.end() )
  826. {
  827. //1、找不到子系统时直接返回
  828. CBaseDispatch* pDispatchSys = iter->second;
  829. if ( !pDispatchSys )
  830. {
  831. m_DispatchTasksMap.erase(iter);
  832. return false;
  833. }
  834. //2、找到系统后暂停子系统的计算
  835. if ( pDispatchSys->PauseTask(netret.parm) )
  836. {
  837. netret.status = OCC_NETMESSAGE_TRIAN_PAUSE_SUCCESS;
  838. }
  839. else
  840. {
  841. netret.status = OCC_NETMESSAGE_TRIAN_PAUSE_FAIL;
  842. }
  843. }
  844. else
  845. {
  846. netret.status = OCC_NETMESSAGE_TRIAN_PAUSE_CANNOETFIND;
  847. }
  848. //反馈暂停任务结果给教员系统
  849. NetComand_Send(&netret,OCC_SYS_SERVER_TH,OCCCOMMAND::eSvrReplyMsg, nTrainID);
  850. return true;
  851. }
  852. /*******************************************************
  853. 函数名称: ResumeDispatchTask
  854. 函数功能: 恢复调度任务
  855. 输入参数: nCourseID - 课程号
  856. nSysType - 系统类型
  857. nTrainID - 训练号
  858. 输出参数: NULL
  859. 返回值 : bool - true:成功 false:失败
  860. *******************************************************/
  861. bool CBaseDispatchTaskMg::ResumeDispatchTask( int nCourseID,int nSysType,int nTrainID )
  862. {
  863. SVRREPLYMSG netret;
  864. netret.sysType = nSysType;
  865. netret.status = OCC_NETMESSAGE_TRIAN_RESUME_SUCCESS;
  866. string key = Make2IntKey_2(nSysType, nTrainID);
  867. R_Mutex_LOCK(m_MutexDispatchTask);
  868. auto iter = m_DispatchTasksMap.find(key);
  869. if ( iter != m_DispatchTasksMap.end() )
  870. {
  871. //1、找不到子系统时直接返回
  872. CBaseDispatch* pDispatchSys = iter->second;
  873. if ( !pDispatchSys )
  874. {
  875. m_DispatchTasksMap.erase(iter);
  876. return false;
  877. }
  878. //2、找到系统后恢复子系统的计算
  879. if ( pDispatchSys->ResumeTask(netret.parm) )
  880. {
  881. netret.status = OCC_NETMESSAGE_TRIAN_RESUME_SUCCESS;
  882. }
  883. else
  884. {
  885. netret.status = OCC_NETMESSAGE_TRIAN_RESUME_FAIL;
  886. }
  887. }
  888. else
  889. {
  890. netret.status = OCC_NETMESSAGE_TRIAN_RESUME_CANNOETFIND;
  891. }
  892. //反馈恢复任务结果给教员系统
  893. NetComand_Send(&netret,OCC_SYS_SERVER_TH,OCCCOMMAND::eSvrReplyMsg, nTrainID);
  894. return true;
  895. }
  896. /*******************************************************
  897. 函数名称: RunDispatchTask
  898. 函数功能: 运行调度任务
  899. 输入参数: nCourseID - 课程号
  900. nSysType - 系统类型
  901. nTrainID - 训练号
  902. 输出参数: NULL
  903. 返回值 : bool - true:成功 false:失败
  904. *******************************************************/
  905. bool CBaseDispatchTaskMg::RunDispatchTask( int nCourseID,int nSysType,int nTrainID )
  906. {
  907. SVRREPLYMSG netret;
  908. netret.sysType = nSysType;
  909. netret.status = OCC_NETMESSAGE_TRIAN_RUN_SUCCESS;
  910. string key = Make2IntKey_2(nSysType, nTrainID);
  911. R_Mutex_LOCK(m_MutexDispatchTask);
  912. auto iter = m_DispatchTasksMap.find(key);
  913. if ( iter != m_DispatchTasksMap.end() )
  914. {
  915. CBaseDispatch* pDispatchSys = iter->second;
  916. if ( !pDispatchSys )
  917. {
  918. m_DispatchTasksMap.erase(iter);
  919. return false;
  920. }
  921. //if (pdispatchsys->m_RunStatus==DISPATCH_RUN_STATUS_INITED)
  922. {
  923. if ( !InitNetConnectStatus(nTrainID, nSysType) )
  924. {
  925. return false;
  926. }
  927. }
  928. if ( pDispatchSys->StartTask(netret.parm) )
  929. {
  930. netret.status = OCC_NETMESSAGE_TRIAN_RUN_SUCCESS;
  931. }
  932. else
  933. {
  934. netret.status = OCC_NETMESSAGE_TRIAN_RUN_FAIL;
  935. }
  936. }
  937. else
  938. {
  939. netret.status = OCC_NETMESSAGE_TRIAN_RUN_CANNOETFIND;
  940. }
  941. //NetComand_Send(&netret,OCC_SYS_SERVER_TH,OCCCOMMAND::eSvrReplyMsg,trainid);//创建课程
  942. //修改为立即发送
  943. OCCCOMMAND NetCmd;
  944. NetCmd.cmdType = OCCCOMMAND::eSvrReplyMsg;
  945. NetCmd.DesSysType = OCC_SYS_SERVER_TH;
  946. NetCmd.ScrSysType = OCC_SYS_SERVER_SVR;
  947. NetCmd.DesNetID = m_TechServerID;
  948. NetCmd.TrainningID = nTrainID;
  949. NetCmd.DateLen = sizeof(SVRREPLYMSG);
  950. NetCmd.setPacketValue(&netret,OCCCOMMAND::eSvrReplyMsg);
  951. m_pNetWork->_ISend_TCPData_RightNow(NetCmd);
  952. return true;
  953. }
  954. /*******************************************************
  955. 函数名称: RecTrianPosition
  956. 函数功能: 接收训练系统位置
  957. 输入参数: nSysType - 系统类型
  958. trainid - 训练号
  959. sysid - 系统号
  960. 输出参数: NULL
  961. 返回值 : bool - true:成功 false:失败
  962. *******************************************************/
  963. bool CBaseDispatchTaskMg::RecTrianPosition( int nSysType,int nTrainID,int nSysID )
  964. {
  965. R_Mutex_LOCK(m_MutexTrainConect);
  966. auto iter = m_NetTrainNectMap.find(nTrainID);
  967. if ( iter == m_NetTrainNectMap.end() )
  968. {
  969. NETTRIANDISTRI nettrian;
  970. nettrian.nTrainingID = nTrainID;
  971. nettrian.AddSys(nSysType,nSysID);
  972. m_NetTrainNectMap.insert(make_pair(nTrainID,nettrian));
  973. }
  974. else
  975. {
  976. iter->second.AddSys(nSysType,nSysID);
  977. }
  978. return true;
  979. }
  980. /*******************************************************
  981. 函数名称: GetTaskStatusData
  982. 函数功能: 获取任务状态数据
  983. 输入参数: statusdada - 状态数据
  984. 输出参数: statusdada - 状态数据
  985. 返回值 : bool - true:成功 false:失败
  986. *******************************************************/
  987. bool CBaseDispatchTaskMg::GetTaskStatusData()
  988. {
  989. return false;
  990. }
  991. /*******************************************************
  992. 函数名称: GetPlugin_ByModuleID
  993. 函数功能: 通过模块号获取模块加载对象指针
  994. 输入参数: nModuleID - 模块号
  995. 输出参数: NULL
  996. 返回值 : sPlugin* - 模块加载对象指针
  997. *******************************************************/
  998. sPlugin* CBaseDispatchTaskMg::GetPlugin_ByModuleID(int nModuleID)
  999. {
  1000. sPlugin* pPlugin = NULL;
  1001. auto itor = m_PluginMap.find(nModuleID);
  1002. if ( itor != m_PluginMap.end() )
  1003. {
  1004. pPlugin = &itor->second;
  1005. }
  1006. return pPlugin;
  1007. }
  1008. /*******************************************************
  1009. 函数名称: DealWith_RollBack_CtrlCmd
  1010. 函数功能: 处理回滚控制命令
  1011. 输入参数: NetCmd - 网络命令
  1012. 输出参数: NULL
  1013. 返回值 : void
  1014. *******************************************************/
  1015. void CBaseDispatchTaskMg::DealWith_RollBack_CtrlCmd( OCCCOMMAND NetCmd )
  1016. {
  1017. int nTrainID = NetCmd.Net_JY_RollBackCtrl.nTrainID;
  1018. int nPointID = NetCmd.Net_JY_RollBackCtrl.nPointID;
  1019. int nCtrlType = NetCmd.Net_JY_RollBackCtrl.nCtrlType;
  1020. BOOL bFeedBack = TRUE;
  1021. BOOL bResult = TRUE;
  1022. //1、执行回滚控制指令
  1023. switch ( nCtrlType )
  1024. {
  1025. case RollCtrl_Type_Prepare: //回滚准备
  1026. {
  1027. bResult = RollBack_Prepare(nTrainID, nPointID);
  1028. }
  1029. break;
  1030. case RollCtrl_Type_Excute: //回滚执行
  1031. {
  1032. bResult = RollBack_Excute(nTrainID, nPointID);
  1033. }
  1034. break;
  1035. case RollCtrl_Type_Finish: //回滚完成
  1036. {
  1037. bResult = RollBack_Finish(nTrainID, nPointID);
  1038. }
  1039. break;
  1040. case RollCtrl_Type_Save: //回滚保存
  1041. {
  1042. if ( !m_bRollBackEvent )
  1043. {
  1044. int nSize = min(sizeof(m_cRollBackDes), sizeof(NetCmd.Net_JY_RollBackCtrl.cPointDes));
  1045. memcpy(m_cRollBackDes, NetCmd.Net_JY_RollBackCtrl.cPointDes, nSize);
  1046. m_bRollBackEvent = TRUE;
  1047. }
  1048. bFeedBack = FALSE;
  1049. }
  1050. break;
  1051. case RollCtrl_Type_Event:
  1052. {
  1053. RollBack_Prepare(nTrainID, nPointID);
  1054. RollBack_Excute (nTrainID, nPointID);
  1055. RollBack_Finish (nTrainID, nPointID);
  1056. bFeedBack = FALSE;
  1057. }
  1058. break;
  1059. default:
  1060. break;
  1061. }
  1062. //2、反馈回滚控制命令执行状态
  1063. if ( bFeedBack )
  1064. {
  1065. int nResult = ( bResult ? 1 : 0 );
  1066. FeedBack_RollBack_Cmd(nTrainID, nPointID, nCtrlType, nResult);
  1067. }
  1068. }
  1069. /*******************************************************
  1070. 函数名称: LoadSub_DispatchSys
  1071. 函数功能: 加载调度子系统
  1072. 输入参数: NULL
  1073. 输出参数: NULL
  1074. 返 回 值: void
  1075. *******************************************************/
  1076. void CBaseDispatchTaskMg::LoadSub_DispatchSys()
  1077. {
  1078. #ifdef IN_WINDOWS
  1079. std::string Str_FileName = GetFolder_Module_2() + "\\SYS_CONFIG\\Module.xls";
  1080. #else
  1081. std::string Str_FileName = GetFolder_Module_2() + "SYS_CONFIG/Module.xls";
  1082. #endif // IN_WINDOWS
  1083. YD_ExcelReader TmpXlsRead;
  1084. TmpXlsRead.LoadSheet(Str_FileName,"模块列表");
  1085. for ( int nIndex = 1; nIndex < TmpXlsRead.GetRowCount(); nIndex++ )
  1086. {
  1087. #ifdef IN_WINDOWS
  1088. std::string Str_LibName = GetFolder_Module_2() + "\\" + TmpXlsRead.Cell_AsString(nIndex,1);
  1089. sPlugin Plugin;
  1090. Plugin.nModuleID = TmpXlsRead.Cell_AsInt(nIndex,0);
  1091. Plugin.nFileDll = ::LoadLibrary(Str_LibName.c_str());
  1092. Plugin.nCreatePlug = (_CreateSubModule)GetProcAddress(Plugin.nFileDll, "Create_Sub_Dispatch");
  1093. Plugin.nFreePlug = (_FreeSubModule)GetProcAddress (Plugin.nFileDll, "Free_Sub_Dispatch");
  1094. Plugin.Str_ModuleName = TmpXlsRead.Cell_AsString(nIndex,2);
  1095. Plugin.Check_Is_OK();
  1096. m_PluginMap.insert(std::make_pair(Plugin.nModuleID,Plugin));
  1097. OUT_LOG(LOG_LEVEL_NORMAL, "%s加载成功:%s", \
  1098. TmpXlsRead.Cell_AsString(nIndex,2).c_str(), \
  1099. TmpXlsRead.Cell_AsString(nIndex,1).c_str());
  1100. #else
  1101. std::string Str_LibName = GetFolder_Module_2() + TmpXlsRead.Cell_AsString(nIndex, 1);
  1102. sPlugin Plugin;
  1103. Plugin.nModuleID = TmpXlsRead.Cell_AsInt(nIndex, 0);
  1104. Plugin.nFileDll = dlopen(Str_LibName.c_str(), RTLD_LAZY);
  1105. Plugin.nCreatePlug = (_CreateSubModule)dlsym(Plugin.nFileDll, "Create_Sub_Dispatch");
  1106. Plugin.nFreePlug = (_FreeSubModule) dlsym(Plugin.nFileDll, "Free_Sub_Dispatch");
  1107. Plugin.Str_ModuleName = coding_conv_ns::gbk_to_utf8_str(TmpXlsRead.Cell_AsString(nIndex,2).c_str());
  1108. Plugin.Check_Is_OK();
  1109. m_PluginMap.insert(std::make_pair(Plugin.nModuleID, Plugin));
  1110. OUT_LOG(LOG_LEVEL_NORMAL, "%s加载成功:%s", \
  1111. TmpXlsRead.Cell_AsString(nIndex, 2).c_str(), \
  1112. TmpXlsRead.Cell_AsString(nIndex, 1).c_str());
  1113. #endif
  1114. }
  1115. }
  1116. /*******************************************************
  1117. 函数名称: RollBack_Record
  1118. 函数功能: 回滚记录
  1119. 输入参数: NULL
  1120. 输出参数: NULL
  1121. 返 回 值: BOOL - TRUE:成功 FALSE:失败
  1122. *******************************************************/
  1123. BOOL CBaseDispatchTaskMg::RollBack_Record()
  1124. {
  1125. //1、打开回滚数据记录数据库
  1126. if ( !m_RollBackTool.Open_SaveDB(m_nCurTrainID,m_nCurRBPointID) )
  1127. {
  1128. return FALSE;
  1129. }
  1130. //2、记录回滚数据
  1131. BOOL bFlag = TRUE;
  1132. if ( true )
  1133. {
  1134. R_Mutex_LOCK(m_MutexDispatchTask);
  1135. for ( auto var : m_DispatchTasksMap )
  1136. {
  1137. //(1)、对象指针为空时直接继续
  1138. CBaseDispatch* pDispatchSys = var.second;
  1139. if ( !pDispatchSys ) continue;
  1140. //(2)、记录数据并返回记录结果
  1141. if (!pDispatchSys->RollBack_Record(&m_RollBackTool))
  1142. {
  1143. bFlag = FALSE;
  1144. }
  1145. }
  1146. }
  1147. //3、记录成功的前提下将回滚节点信息存入数据库
  1148. CBaseDispatch* pSubDispatch = GetSub_Dispatch(OCC_SYS_XD_SVR);
  1149. if ( bFlag && pSubDispatch )
  1150. {
  1151. int nDate = Get_Number_Date_2();
  1152. int nSysTime = GetNumTime_Second_2();
  1153. int nSimTime = pSubDispatch->GetSim_NumberTime();
  1154. std::string Str_Sql = Str_Format("insert into RollBack_Record ([TrainID],[PointID],[CourseID],[Date],[SimTime],[SysTime],[Description]) values(%d,%d,%d,%d,%d,%d,'%s')",
  1155. m_nCurTrainID,
  1156. m_nCurRBPointID,
  1157. m_nCurCourseID,
  1158. nDate,
  1159. nSimTime,
  1160. nSysTime,
  1161. m_cRollBackDes);
  1162. pSubDispatch->Excute_Sql(Str_Sql);
  1163. }
  1164. return bFlag;
  1165. }
  1166. /*******************************************************
  1167. 函数名称: RollBack_Excute
  1168. 函数功能: 回滚执行
  1169. 输入参数: nTrainID - 训练号
  1170. nPointID - 节点号
  1171. 输出参数: NULL
  1172. 返回值 : BOOL - TRUE:成功 FALSE:失败
  1173. *******************************************************/
  1174. BOOL CBaseDispatchTaskMg::RollBack_Excute( int nTrainID, int nPointID )
  1175. {
  1176. //1、先检查回滚执行命令参数是否正确
  1177. if ( !m_RollBackTool.Check_IsRight_RollBackCmd(nTrainID,nPointID) )
  1178. {
  1179. return FALSE;
  1180. }
  1181. //2、执行回滚执行命令
  1182. BOOL bFlag = TRUE;
  1183. R_Mutex_LOCK(m_MutexDispatchTask);
  1184. for ( auto var : m_DispatchTasksMap )
  1185. {
  1186. //1、对象指针为空时直接继续
  1187. CBaseDispatch* pDispatchSys = var.second;
  1188. if ( !pDispatchSys )
  1189. {
  1190. continue;
  1191. }
  1192. //2、执行回滚操作并返回执行结果
  1193. if (!pDispatchSys->RollBack_Excute(&m_RollBackTool))
  1194. {
  1195. bFlag = FALSE;
  1196. }
  1197. }
  1198. return bFlag;
  1199. }
  1200. /*******************************************************
  1201. 函数名称: RollBack_Prepare
  1202. 函数功能: 回滚准备
  1203. 输入参数: nTrainID - 训练号
  1204. nPointID - 节点号
  1205. 输出参数: NULL
  1206. 返回值 : BOOL - TRUE:成功 FALSE:失败
  1207. *******************************************************/
  1208. BOOL CBaseDispatchTaskMg::RollBack_Prepare( int nTrainID, int nPointID )
  1209. {
  1210. //1、设置回滚信息并打开数据库
  1211. m_RollBackTool.SetRB_TrainID(nTrainID);
  1212. m_RollBackTool.SetRB_PointID(nPointID);
  1213. if (!m_RollBackTool.Open_LoadDB(nTrainID, nPointID))
  1214. {
  1215. return FALSE;
  1216. }
  1217. //2、准备回滚
  1218. BOOL bFlag = TRUE;
  1219. R_Mutex_LOCK(m_MutexDispatchTask);
  1220. for ( auto var : m_DispatchTasksMap )
  1221. {
  1222. //1)、对象指针为空时直接继续
  1223. CBaseDispatch* pDispatchSys = var.second;
  1224. if ( !pDispatchSys )
  1225. {
  1226. continue;
  1227. }
  1228. //2)、准备回滚并返回准备结果
  1229. if ( !pDispatchSys->RollBack_Prepare(&m_RollBackTool) )
  1230. {
  1231. bFlag = FALSE;
  1232. }
  1233. }
  1234. return bFlag;
  1235. }
  1236. /*******************************************************
  1237. 函数名称: RollBack_Finish
  1238. 函数功能: 回滚-完成
  1239. 输入参数: nTrainID - 训练号
  1240. nPointID - 节点号
  1241. 输出参数: NULL
  1242. 返回值 : BOOL - TRUE:成功 FALSE:失败
  1243. *******************************************************/
  1244. BOOL CBaseDispatchTaskMg::RollBack_Finish(int nTrainID, int nPointID)
  1245. {
  1246. //1、先检查回滚执行命令参数是否正确
  1247. if (!m_RollBackTool.Check_IsRight_RollBackCmd(nTrainID, nPointID))
  1248. {
  1249. return FALSE;
  1250. }
  1251. //2、执行回滚完成命令
  1252. BOOL bFlag = TRUE;
  1253. R_Mutex_LOCK(m_MutexDispatchTask);
  1254. for ( auto var : m_DispatchTasksMap )
  1255. {
  1256. //1、对象指针为空时直接继续
  1257. CBaseDispatch* pDispatchSys = var.second;
  1258. if ( !pDispatchSys )
  1259. {
  1260. continue;
  1261. }
  1262. //2、准备回滚并返回准备结果
  1263. if (!pDispatchSys->RollBack_Finish(&m_RollBackTool))
  1264. {
  1265. bFlag = FALSE;
  1266. }
  1267. }
  1268. return TRUE;
  1269. }
  1270. /*******************************************************
  1271. 函数名称: RollBack_RecordThread
  1272. 函数功能: 回滚数据记录线程响应函数
  1273. 输入参数: NULL
  1274. 输出参数: NULL
  1275. 返回值 : BOOL - TRUE:记录成功 FALSE:记录失败
  1276. *******************************************************/
  1277. BOOL CBaseDispatchTaskMg::RollBack_RecordThread()
  1278. {
  1279. //1、记录条件不满足时直接返回FALSE
  1280. if ( !CheckIs_Record_RollBack() )
  1281. {
  1282. return FALSE;
  1283. }
  1284. //2、记录回滚数据
  1285. m_dLastRecordTime = GetNowTime(TIMEUNIT_S);
  1286. BOOL bFlag = RollBack_Record();
  1287. //3、反馈回滚记录状态
  1288. int nResult = (bFlag ? 1 : 0);
  1289. FeedBack_RollBack_Cmd(m_nCurTrainID, m_nCurRBPointID, RollCtrl_Type_Save, nResult);
  1290. m_nCurRBPointID++;
  1291. return bFlag;
  1292. }
  1293. /*******************************************************
  1294. 函数名称: CheckIs_Record_RollBack
  1295. 函数功能: 检查是否记录回滚文件
  1296. 输入参数: NULL
  1297. 输出参数: NULL
  1298. 返回值 : BOOL - TRUE:是 FALSE:否
  1299. *******************************************************/
  1300. BOOL CBaseDispatchTaskMg::CheckIs_Record_RollBack()
  1301. {
  1302. BOOL bFlag = FALSE;
  1303. //1、时间因素,隔一分钟记录一次,或者跨天跨月
  1304. double dSysSecondTime = GetNowTime(TIMEUNIT_S);
  1305. if ( m_dLastRecordTime > 0 &&
  1306. dSysSecondTime - m_dLastRecordTime >= 60.0)
  1307. {
  1308. //bFlag = TRUE;
  1309. }
  1310. if ( dSysSecondTime < m_dLastRecordTime - 600 )
  1311. {
  1312. //bFlag = TRUE;
  1313. }
  1314. //2、初始情况下记录一次
  1315. if ( m_dLastRecordTime <= 0 )
  1316. {
  1317. //bFlag = TRUE;
  1318. }
  1319. //3、特定事件发生时记录一次
  1320. if ( m_bRollBackEvent )
  1321. {
  1322. bFlag = TRUE;
  1323. m_bRollBackEvent = FALSE; //消除事件
  1324. }
  1325. return bFlag;
  1326. }
  1327. /*******************************************************
  1328. 函数名称: GetSub_Dispatch
  1329. 函数功能: 获取子调度系统
  1330. 输入参数: nSysType - 系统类型
  1331. 输出参数: NULL
  1332. 返回值 : CBaseDispatch* - 子调度系统指针
  1333. *******************************************************/
  1334. CBaseDispatch* CBaseDispatchTaskMg::GetSub_Dispatch(int nSysType)
  1335. {
  1336. CBaseDispatch* pSubDispatch = NULL;
  1337. R_Mutex_LOCK(m_MutexDispatchTask);
  1338. string Str_Key = Make2IntKey_2(nSysType,m_nCurTrainID);
  1339. auto itor = m_DispatchTasksMap.find(Str_Key);
  1340. if ( itor != m_DispatchTasksMap.end() )
  1341. {
  1342. pSubDispatch = itor->second;
  1343. }
  1344. return pSubDispatch;
  1345. }
  1346. /*******************************************************
  1347. 函数名称: FeedBack_RollBack_Cmd
  1348. 函数功能: 反馈回滚命令
  1349. 输入参数: nTrainID - 训练号
  1350. nPointID - 节点号
  1351. nType - 类型
  1352. nResult - 结果
  1353. 输出参数: NULL
  1354. 返回值 : void
  1355. *******************************************************/
  1356. void CBaseDispatchTaskMg::FeedBack_RollBack_Cmd(int nTrainID, int nPointID,
  1357. int nType, int nResult)
  1358. {
  1359. TRAIN_ROLLBACK_FEEDBACK RollBackFeedBack;
  1360. RollBackFeedBack.nTrainID = nTrainID;
  1361. RollBackFeedBack.nPointID = nPointID;
  1362. RollBackFeedBack.nCtrlType = nType;
  1363. RollBackFeedBack.nResult = nResult;
  1364. NetComand_Send(&RollBackFeedBack, OCC_SYS_SERVER_TH, \
  1365. OCCCOMMAND::eTrainRollBackFeedBack,m_nCurTrainID);
  1366. }
  1367. /*******************************************************
  1368. 函数名称: Send_SetUserRoll_Cmd
  1369. 函数功能: 发送分配角色指令
  1370. 输入参数: nSysID - 系统号
  1371. 输出参数: NULL
  1372. 返 回 值: void
  1373. *******************************************************/
  1374. void CBaseDispatchTaskMg::Send_SetUserRoll_Cmd( int nSysID )
  1375. {
  1376. //1、网络指针未空时直接返回
  1377. if ( !m_pNetWork ) return;
  1378. //2、模拟联合教员向客户端发送分配角色命令
  1379. TRAINSETUSERROLL TrainSetUserRool;
  1380. TrainSetUserRool.NetID = m_pNetWork->_IGet_System_ID();
  1381. TrainSetUserRool.SysType = OCC_SYS_XD_SVR;
  1382. OCCCOMMAND NetCmd;
  1383. NetCmd.cmdType = OCCCOMMAND::eSetUserRoll;
  1384. NetCmd.DesSysType = OCC_SYS_XD_CLIENT;
  1385. NetCmd.ScrSysType = OCC_SYS_SERVER_SVR;
  1386. NetCmd.DesNetID = nSysID;
  1387. NetCmd.ScrNetID = m_pNetWork->_IGet_System_ID();
  1388. NetCmd.TrainningID = m_pNetWork->_IGetTrainID();
  1389. NetCmd.DateLen = sizeof(TRAINSETUSERROLL);
  1390. NetCmd.setPacketValue(&TrainSetUserRool,NetCmd.cmdType);
  1391. m_pNetWork->_ISend_TCPData_RightNow(NetCmd);
  1392. }
  1393. /*******************************************************
  1394. 函数名称: ThreadFun_DealTCPData
  1395. 函数功能: 线程函数_处理TCP数据
  1396. 输入参数: NULL
  1397. 输出参数: NULL
  1398. 返 回 值: void
  1399. *******************************************************/
  1400. void CBaseDispatchTaskMg::ThreadFun_DealTCPData()
  1401. {
  1402. m_ReceiveMsgThreadOut = FALSE;
  1403. try
  1404. {
  1405. OCCCOMMAND NetCmd;
  1406. while ( !m_ReceiveMsgThreadOut )
  1407. {
  1408. if ( GetRecNetMsg(NetCmd) )
  1409. {
  1410. NetComand_Receive(NetCmd);
  1411. }
  1412. else
  1413. {
  1414. Thread_Sleep(TIMESPAN_LVN);
  1415. }
  1416. }
  1417. }
  1418. catch (...)
  1419. {
  1420. OUT_LOG(LOG_LEVEL_ERROR,"NetMsgDealThread \
  1421. Have a Error");
  1422. }
  1423. }
  1424. /*******************************************************
  1425. 函数名称: ThreadFun_DealUDPData
  1426. 函数功能: 线程函数_处理UDP数据
  1427. 输入参数: NULL
  1428. 输出参数: NULL
  1429. 返 回 值: void
  1430. *******************************************************/
  1431. void CBaseDispatchTaskMg::ThreadFun_DealUDPData()
  1432. {
  1433. m_ReceiveRealMsgThreadOut = FALSE;
  1434. try
  1435. {
  1436. OCCCOMMAND NetCmd;
  1437. while (!m_ReceiveRealMsgThreadOut)
  1438. {
  1439. if (GetRecNetRealMsg(NetCmd))
  1440. {
  1441. NetComand_Receive(NetCmd);
  1442. }
  1443. else
  1444. {
  1445. Thread_Sleep(TIMESPAN_LVN);
  1446. }
  1447. }
  1448. }
  1449. catch (...)
  1450. {
  1451. OUT_LOG(LOG_LEVEL_ERROR,"NetRealMsgDealThread \
  1452. Have a Error");
  1453. }
  1454. }
  1455. /*******************************************************
  1456. 函数名称: ThreadFun_DealGroupData
  1457. 函数功能: 线程函数_处理组播数据
  1458. 输入参数: NULL
  1459. 输出参数: NULL
  1460. 返 回 值: void
  1461. *******************************************************/
  1462. void CBaseDispatchTaskMg::ThreadFun_DealGroupData()
  1463. {
  1464. m_ReceiveGroupMsgThreadOut = FALSE;
  1465. try
  1466. {
  1467. OCCCOMMAND NetCmd;
  1468. while ( !m_ReceiveGroupMsgThreadOut )
  1469. {
  1470. if ( GetRecNetGroupMsg(NetCmd))
  1471. {
  1472. NetComand_Receive(NetCmd);
  1473. }
  1474. else
  1475. {
  1476. Thread_Sleep(TIMESPAN_LVN);
  1477. }
  1478. }
  1479. }
  1480. catch (...)
  1481. {
  1482. OUT_LOG(LOG_LEVEL_ERROR, "NetGroupMsgDealThread \
  1483. Have a Error");
  1484. }
  1485. }
  1486. /*******************************************************
  1487. 函数名称: ThreadFun_RollBackRecord
  1488. 函数功能: 线程函数_处理回滚记录
  1489. 输入参数: NULL
  1490. 输出参数: NULL
  1491. 返 回 值: void
  1492. *******************************************************/
  1493. void CBaseDispatchTaskMg::ThreadFun_RollBackRecord()
  1494. {
  1495. m_RollBackRecordThreadOut = FALSE;
  1496. try
  1497. {
  1498. while ( !m_RollBackRecordThreadOut )
  1499. {
  1500. if ( !RollBack_RecordThread() )
  1501. {
  1502. Thread_Sleep(TIMESPAN_LVN);
  1503. }
  1504. }
  1505. }
  1506. catch (...)
  1507. {
  1508. OUT_LOG(LOG_LEVEL_ERROR, "回滚记录错误");
  1509. }
  1510. }