#pragma once #include "BaseDispatch.h" #include "FrameTool_I.h" #include "NetWorkMng_I.h" #if defined(_MSC_VER) || defined(WIN64) || defined(__WIN64__) || defined(WIN32) || defined(_WIN32) #ifdef _YD_OCC_BASEDISPATCHTASK_MG_SDK #define _YD_OCC_BASEDISPATCHTASK_MG_MODE __declspec(dllexport) #else #define _YD_OCC_BASEDISPATCHTASK_MG_MODE __declspec(dllimport) #endif #else //linux #ifdef _YD_OCC_BASEDISPATCHTASK_MG_SDK #define _YD_OCC_BASEDISPATCHTASK_MG_MODE __attribute__ ((visibility("default"))) #else #define _YD_OCC_BASEDISPATCHTASK_MG_MODE #endif #endif //模块创建和释放的函数指针 typedef CBaseDispatch* (__stdcall* _CreateSubModule)(); typedef void(__stdcall* _FreeSubModule)(void*); //模块管理信息 struct sPlugin { int nModuleID; HINSTANCE nFileDll; //库的句柄 _CreateSubModule nCreatePlug; //创建模块的函数指针 _FreeSubModule nFreePlug; //释放模块的函数指针 BOOL bInitOk; //是否初始化成功 std::string Str_ModuleName; //模块名称 void Check_Is_OK() { if ( !nCreatePlug || !nFreePlug ) { bInitOk = FALSE; } else { bInitOk = TRUE; } } sPlugin() { nModuleID = -1; //模块编号 nFileDll = NULL; //库的句柄 nCreatePlug = NULL; //创建模块的函数指针 nFreePlug = NULL; //释放模块的函数指针 bInitOk = FALSE; //是否初始化成功 Str_ModuleName = ""; //模块名称 } }; typedef map Map_Plugin; enum ROLLBACK_CTRLTYPE { RollCtrl_Type_Prepare = 1, //回滚控制类型-准备 RollCtrl_Type_Excute = 2, //回滚控制类型-执行 RollCtrl_Type_Finish = 3, //回滚控制类型-完成 RollCtrl_Type_Save = 4, //回滚控制类型-保存 RollCtrl_Type_Event = 5, //回滚控制类型-事件 }; enum ALLTRAIN_STATUS { AllTrain_Status_Init = 1, //全部训练状态-初始化 AllTrain_Status_Run = 2, //全部训练状态-运行 AllTrain_Status_Stop = 3, //全部训练状态-停止 }; //定义:回放控制类型 enum PLAYBACK_CTRLTYPE { PlayBack_CtrlType_Start = 1, //回放控制类型-开始:附加参数(训练号,课程号,开始时间) PlayBack_CtrlType_Pause = 2, //回放控制类型-暂停:附加参数(无) PlayBack_CtrlType_Continue = 3, //回放控制类型-继续:附加参数(无) PlayBack_CtrlType_Stop = 4, //回放控制类型-停止:附加参数(无) PlayBack_CtrlType_SetSpeed = 5, //回放控制类型-快进:附加参数(快进倍数) }; //定义:回放反馈类型 enum PLAYBACK_FEEDBACKTYPE { PlayBack_FeedBackType_CtrlResult = 1, //回放反馈类型-控制结果:附加参数(控制类型,控制结果) PlayBack_FeedBackType_CurTime = 2, //回放反馈类型-当前时间:附加参数(当前时间) PlayBack_FeedBackType_Finish = 3, //回放反馈类型-回放完成:附加参数(无) }; struct ASSIGN_CMD { int nCmdType; //命令类型 vector VecModuleID; //模块编号 }; typedef map Map_AssignCmd; class _YD_OCC_BASEDISPATCHTASK_MG_MODE CBaseDispatchTaskMg { public: CBaseDispatchTaskMg(void); virtual~CBaseDispatchTaskMg(void); public: virtual bool StartWork(CFrameTool_I* pFrmTool); bool CreateDispatchTask( int courseid, int systype,int trainid ,int runlineid,int parm1, int parm2 ,InitCourInfo* curseinfo ); bool DeleteDispatchTask ( int nCourseID,int nSysType,int nTrainID ); bool StopDispatchTask ( int nCourseID,int nSysType,int nTrainID ); bool PauseDispatchTask ( int nCourseID,int nSysType,int nTrainID ) ; bool ResumeDispatchTask ( int nCourseID,int nSysType,int nTrainID ); bool RunDispatchTask ( int nCourseID,int nSysType,int nTrainID ); bool NetComand_Receive(OCCCOMMAND NetCmd); void NetComand_Send(LPBASENETPACKET pNetPack,int nDesSysType,OCCCOMMAND::CmdType eCmdType,int nTrainID = 0 ); int Start_Redis_Connect(); bool RecTrianPosition(int nSysType,int nTrainID,int nSysID); //获取系统模块的位置信息,即告诉服务器客户端的相关位置信息 virtual CBaseDispatch* CreateNewTaskType( int nSysType ) = 0; virtual bool InitNetConnectStatus(int nTrainID, int nSysType) = 0; virtual void Deal_NetComand( OCCCOMMAND& NetCmd ) = 0; virtual bool InitConfigParam() = 0; virtual void DeleteReceiveGroupMsg(int nTrainID,int nSysType) = 0; virtual void AddReceiveGroupMsg (int nTrainID,int nSysType, CBaseDispatch* pdispatchsys) = 0; //回滚相关 virtual BOOL RollBack_Record(); //回滚-记录 virtual BOOL RollBack_Excute ( int nTrainID,int nPointID ); //回滚-执行 virtual BOOL RollBack_Prepare( int nTrainID,int nPointID ); //回滚-准备 virtual BOOL RollBack_Finish ( int nTrainID,int nPointID ); //回滚-完成 virtual BOOL RollBack_RecordThread(); //回滚-线程 CBaseDispatch* GetSub_Dispatch(int nSysType); //获取接收数据-TCP bool GetRecNetMsg( OCCCOMMAND& NetCmd ) { bool bFlag = false; if ( m_QI_GetList_TCP.pop(NetCmd) ) { bFlag = true; } return bFlag; } //获取接收数据-UDP bool GetRecNetRealMsg( OCCCOMMAND& NetCmd ) { bool bFlag = false; if ( m_QI_GetList_UDP.pop(NetCmd) ) { bFlag = true; } return bFlag; } //获取接收数据-组播 bool GetRecNetGroupMsg( OCCCOMMAND& NetCmd ) { bool bFlag = false; if (m_QI_GetList_Group.pop(NetCmd)) { bFlag = true; } return bFlag; } sPlugin* GetPlugin_ByModuleID( int nModuleID ); bool GetTaskStatusData(); void SetFrmTooL(CFrameTool_I* pFrmTool) { m_pFrmTool = pFrmTool; } protected: void InitDate(); bool NetComandToServer (OCCCOMMAND& NetCmd); bool Send_TrainEnd_2Client(OCCCOMMAND NetCmd); bool Send_TrainBeg_2Client(OCCCOMMAND NetCmd); void Add_AssignCmd_List(int nCmdType,std::string Str_ModuleList); BOOL AssignCmd_ToModule(OCCCOMMAND NetCmd, vector VecModuleID); void MakeCmd_DealModule(OCCCOMMAND NetCmd, vector& VecModuleID); void LoadSub_DispatchSys(); void DealWith_RollBack_CtrlCmd( OCCCOMMAND NetCmd ); BOOL CheckIs_Record_RollBack(); //反馈回滚状态 void FeedBack_RollBack_Cmd(int nTrainID, int nPointID, int nType, int nResult); //发送分配角色指令 void Send_SetUserRoll_Cmd(int nSysID); private: void ThreadFun_DealTCPData(); //线程函数_处理TCP数据 void ThreadFun_DealUDPData(); //线程函数_处理UDP数据 void ThreadFun_DealGroupData(); //线程函数_处理组播数据 void ThreadFun_RollBackRecord(); //线程函数_处理回滚记录 public: int m_NetServerID; //服务器系统号 int m_TechServerID; //教员系挺号 int m_nViewSysSvrID; //视景协同服务器ID int m_nCurTrainID; //当前训练号 int m_nCurCourseID; //当前课程号 int m_nCurRBPointID; //当前回滚记录节点:给教员反馈后+1 int m_nEndTrainingTime; //结束训练时间 int m_nSysSimulateTime; //系统仿真时间 double m_dLastRecordTime; //最后一次记录时间 int m_nAllTrainStatus; //全部训练状态 BOOL m_bRollBackEvent; //是否具有回滚触发事件 char* m_pLogBuf; //日志缓存 Map_Plugin m_PluginMap; //模块容器 CNetWorkMng_I* m_pNetWork; //网络模块 CRollBack_ITool m_RollBackTool; //回滚工具模块 YD_RedisClient m_RedisClient; //Redis操作客户端 Map_AssignCmd m_AssignCmdMap; //分配命令列表 protected: CommandQueue m_QI_GetList_TCP; //接收队列-TCP数据 CommandQueue m_QI_GetList_UDP; //接收队列-UDP数据 CommandQueue m_QI_GetList_Group; //接收队列-组播数据 CommandQueue m_QI_SendList_TCP; //发送队列-TCP数据 CommandQueue m_QI_SendList_UDP; //发送队列-UDP数据 CommandQueue m_QI_SendList_Group; //发送队列-组播数据 std::recursive_mutex m_MutexTrainConect; //训练的系统列表锁 std::recursive_mutex m_MutexDispatchTask; //调度子系统列表锁 NETTRIANNECTMAP m_NetTrainNectMap; //训练列表 DISTASKMAP m_DispatchTasksMap; //调度子系统列表 DATECONFIGMAP m_DataBaseConfigMap; //数据库配置列表 CDebug_Module_I* m_pDebugModule; //调试模块接口 char m_cRollBackDes[100]; //回滚描述信息 public: CFrameTool_I* m_pFrmTool; //框架工具接口 public: bool m_ReceiveMsgThreadOut; //线程退出-TCP数据 bool m_ReceiveRealMsgThreadOut; //线程退出-UDP数据 bool m_ReceiveGroupMsgThreadOut; //线程退出-组播数据 bool m_RollBackRecordThreadOut; //线程退出-回滚记录 std::thread m_Thread_DealTCPData; //线程变量_处理TCP数据 std::thread m_Thread_DealUDPData; //线程变量_处理UDP数据 std::thread m_Thread_DealGroupData; //线程变量_处理组播数据 std::thread m_Thread_RollBackRecord; //线程变量_处理回滚记录 };