诸暨麻将添加redis
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

350 行
12 KiB

  1. #include "StdAfx.h"
  2. #include "ServiceUnits.h"
  3. #include "ControlPacket.h"
  4. #include "HttpThread.h"
  5. #include "google/protobuf/stubs/common.h"
  6. //////////////////////////////////////////////////////////////////////////////////
  7. //静态变量
  8. CServiceUnits * CServiceUnits::g_pServiceUnits = NULL; //对象指针
  9. //////////////////////////////////////////////////////////////////////////////////
  10. BEGIN_MESSAGE_MAP(CServiceUnits, CWnd)
  11. ON_MESSAGE(WM_UICONTROL_REQUEST, OnUIControlRequest)
  12. END_MESSAGE_MAP()
  13. //////////////////////////////////////////////////////////////////////////////////
  14. //构造函数
  15. CServiceUnits::CServiceUnits()
  16. {
  17. //设置变量
  18. m_ServiceStatus = ServiceStatus_Stop;
  19. //设置接口
  20. m_pIServiceUnitsSink = NULL;
  21. //设置对象
  22. ASSERT(g_pServiceUnits == NULL);
  23. if (g_pServiceUnits == NULL) g_pServiceUnits = this;
  24. return;
  25. }
  26. //析构函数
  27. CServiceUnits::~CServiceUnits()
  28. {
  29. ConcludeService();
  30. }
  31. //启动服务
  32. bool CServiceUnits::StartService()
  33. {
  34. //效验状态
  35. ASSERT(m_ServiceStatus == ServiceStatus_Stop);
  36. if (m_ServiceStatus != ServiceStatus_Stop) return false;
  37. //设置状态
  38. SetServiceStatus(ServiceStatus_Config);
  39. //创建窗口
  40. if (m_hWnd == NULL)
  41. {
  42. CRect rcCreate(0, 0, 0, 0);
  43. Create(NULL, NULL, WS_CHILD, rcCreate, AfxGetMainWnd(), 100);
  44. }
  45. //配置服务
  46. if (InitializeService() == false)
  47. {
  48. ConcludeService();
  49. return false;
  50. }
  51. //启动内核
  52. if (StartKernelService() == false)
  53. {
  54. ConcludeService();
  55. return false;
  56. }
  57. //获取列表
  58. SendControlPacket(CT_LOAD_DB_GAME_LIST, NULL, 0);
  59. //启动GET请求队列
  60. CHttpClient::start(&m_AttemperEngineSink);
  61. return true;
  62. }
  63. //停止服务
  64. bool CServiceUnits::ConcludeService()
  65. {
  66. //停止GET请求队列
  67. CHttpClient::end();
  68. //设置变量
  69. SetServiceStatus(ServiceStatus_Stop);
  70. //停止服务
  71. if (m_TimerEngine.GetInterface() != NULL) m_TimerEngine->ConcludeService();
  72. if (m_AttemperEngine.GetInterface() != NULL) m_AttemperEngine->ConcludeService();
  73. if (m_DataBaseEngine.GetInterface() != NULL) m_DataBaseEngine->ConcludeService();
  74. if (m_TCPNetworkEngine.GetInterface() != NULL) m_TCPNetworkEngine->ConcludeService();
  75. if (m_TCPSocketService.GetInterface() != NULL) m_TCPSocketService->ConcludeService();
  76. //c++中使用google protobuf在关闭应用程序之前需要调用google::protobuf::ShutdownProtobufLibrary();要不然会有内存泄露
  77. google::protobuf::ShutdownProtobufLibrary();
  78. m_RedisClient->DisConnect();
  79. return true;
  80. }
  81. //设置接口
  82. bool CServiceUnits::SetServiceUnitsSink(IServiceUnitsSink * pIServiceUnitsSink)
  83. {
  84. //设置变量
  85. m_pIServiceUnitsSink = pIServiceUnitsSink;
  86. return true;
  87. }
  88. //投递请求
  89. bool CServiceUnits::PostControlRequest(WORD wIdentifier, VOID * pData, WORD wDataSize)
  90. {
  91. //状态判断
  92. ASSERT(IsWindow(m_hWnd));
  93. if (IsWindow(m_hWnd) == FALSE) return false;
  94. //插入队列
  95. CWHDataLocker DataLocker(m_CriticalSection);
  96. if (m_DataQueue.InsertData(wIdentifier, pData, wDataSize) == false) return false;
  97. //发送消息
  98. PostMessage(WM_UICONTROL_REQUEST, wIdentifier, wDataSize);
  99. return true;
  100. }
  101. //配置组件
  102. bool CServiceUnits::InitializeService()
  103. {
  104. //加载参数
  105. m_InitParameter.LoadInitParameter();
  106. //创建组件
  107. if ((m_TimerEngine.GetInterface() == NULL) && (m_TimerEngine.CreateInstance() == false)) return false;
  108. if ((m_AttemperEngine.GetInterface() == NULL) && (m_AttemperEngine.CreateInstance() == false)) return false;
  109. if ((m_DataBaseEngine.GetInterface() == NULL) && (m_DataBaseEngine.CreateInstance() == false)) return false;
  110. if ((m_TCPNetworkEngine.GetInterface() == NULL) && (m_TCPNetworkEngine.CreateInstance() == false)) return false;
  111. if ((m_TCPSocketService.GetInterface() == NULL) && (m_TCPSocketService.CreateInstance() == false)) return false;
  112. //组件接口
  113. IUnknownEx * pIAttemperEngine = m_AttemperEngine.GetInterface();
  114. IUnknownEx * pITCPNetworkEngine = m_TCPNetworkEngine.GetInterface();
  115. IUnknownEx * pIAttemperEngineSink = QUERY_OBJECT_INTERFACE(m_AttemperEngineSink, IUnknownEx);
  116. //数据引擎
  117. IUnknownEx * pIDataBaseEngineSink[CountArray(m_DataBaseEngineSink)];
  118. for (WORD i = 0; i < CountArray(pIDataBaseEngineSink); i++) pIDataBaseEngineSink[i] = QUERY_OBJECT_INTERFACE(m_DataBaseEngineSink[i], IUnknownEx);
  119. //内核组件
  120. if (m_TimerEngine->SetTimerEngineEvent(pIAttemperEngine) == false) return false;
  121. if (m_AttemperEngine->SetNetworkEngine(pITCPNetworkEngine) == false) return false;
  122. if (m_AttemperEngine->SetAttemperEngineSink(pIAttemperEngineSink) == false) return false;
  123. if (m_TCPNetworkEngine->SetTCPNetworkEngineEvent(pIAttemperEngine) == false) return false;
  124. if (m_DataBaseEngine->SetDataBaseEngineSink(pIDataBaseEngineSink, CountArray(pIDataBaseEngineSink)) == false) return false;
  125. //协调服务
  126. if (m_TCPSocketService->SetServiceID(NETWORK_CORRESPOND) == false) return false;
  127. if (m_TCPSocketService->SetTCPSocketEvent(pIAttemperEngine) == false) return false;
  128. //调度回调
  129. m_AttemperEngineSink.m_pInitParameter = &m_InitParameter;
  130. m_AttemperEngineSink.m_pITimerEngine = m_TimerEngine.GetInterface();
  131. m_AttemperEngineSink.m_pIDataBaseEngine = m_DataBaseEngine.GetInterface();
  132. m_AttemperEngineSink.m_pITCPNetworkEngine = m_TCPNetworkEngine.GetInterface();
  133. m_AttemperEngineSink.m_pITCPSocketService = m_TCPSocketService.GetInterface();
  134. //数据库回调
  135. for (INT i = 0; i < CountArray(m_DataBaseEngineSink); i++)
  136. {
  137. m_DataBaseEngineSink[i].m_pInitParameter = &m_InitParameter;
  138. m_DataBaseEngineSink[i].m_pIDataBaseEngineEvent = QUERY_OBJECT_PTR_INTERFACE(pIAttemperEngine, IDataBaseEngineEvent);
  139. }
  140. //配置网络
  141. WORD wMaxConnect = m_InitParameter.m_wMaxConnect;
  142. WORD wServicePort = m_InitParameter.m_wServicePort;
  143. if (m_TCPNetworkEngine->SetServiceParameter(wServicePort, wMaxConnect, szCompilation) == false) return false;
  144. //连接redis
  145. m_RedisClient = std::make_shared<RedisBase>();
  146. m_RedisClient->Connect(m_InitParameter.m_RedisHost, m_InitParameter.m_RedisPort, m_InitParameter.m_RedisDb, m_InitParameter.m_RedisTimeOut, m_InitParameter.m_RedisMaxReconnect, m_InitParameter.m_RedisReconnectInterval);
  147. m_AttemperEngineSink.m_RedisClient = m_RedisClient;
  148. return true;
  149. }
  150. //启动内核
  151. bool CServiceUnits::StartKernelService()
  152. {
  153. //时间引擎
  154. if (m_TimerEngine->StartService() == false)
  155. {
  156. ASSERT(FALSE);
  157. return false;
  158. }
  159. //调度引擎
  160. if (m_AttemperEngine->StartService() == false)
  161. {
  162. ASSERT(FALSE);
  163. return false;
  164. }
  165. //数据引擎
  166. if (m_DataBaseEngine->StartService() == false)
  167. {
  168. ASSERT(FALSE);
  169. return false;
  170. }
  171. //协调引擎
  172. if (m_TCPSocketService->StartService() == false)
  173. {
  174. ASSERT(FALSE);
  175. return false;
  176. }
  177. return true;
  178. }
  179. //启动网络
  180. bool CServiceUnits::StartNetworkService()
  181. {
  182. //网络引擎
  183. if (m_TCPNetworkEngine->StartService() == false)
  184. {
  185. ASSERT(FALSE);
  186. return false;
  187. }
  188. return true;
  189. }
  190. //设置状态
  191. bool CServiceUnits::SetServiceStatus(enServiceStatus ServiceStatus)
  192. {
  193. //状态判断
  194. if (m_ServiceStatus != ServiceStatus)
  195. {
  196. //错误通知
  197. if ((m_ServiceStatus != ServiceStatus_Service) && (ServiceStatus == ServiceStatus_Stop))
  198. {
  199. LPCTSTR pszString = TEXT("服务启动失败");
  200. CTraceService::TraceString(pszString, TraceLevel_Exception);
  201. }
  202. //设置变量
  203. m_ServiceStatus = ServiceStatus;
  204. //状态通知
  205. ASSERT(m_pIServiceUnitsSink != NULL);
  206. if (m_pIServiceUnitsSink != NULL) m_pIServiceUnitsSink->OnServiceUnitsStatus(m_ServiceStatus);
  207. }
  208. return true;
  209. }
  210. //发送控制
  211. bool CServiceUnits::SendControlPacket(WORD wControlID, VOID * pData, WORD wDataSize)
  212. {
  213. //状态效验
  214. ASSERT(m_AttemperEngine.GetInterface() != NULL);
  215. if (m_AttemperEngine.GetInterface() == NULL) return false;
  216. //发送控制
  217. m_AttemperEngine->OnEventControl(wControlID, pData, wDataSize);
  218. return true;
  219. }
  220. //控制消息
  221. LRESULT CServiceUnits::OnUIControlRequest(WPARAM wParam, LPARAM lParam)
  222. {
  223. //变量定义
  224. tagDataHead DataHead;
  225. BYTE cbBuffer[MAX_ASYNCHRONISM_DATA];
  226. //提取数据
  227. CWHDataLocker DataLocker(m_CriticalSection);
  228. if (m_DataQueue.DistillData(DataHead, cbBuffer, sizeof(cbBuffer)) == false)
  229. {
  230. ASSERT(FALSE);
  231. return NULL;
  232. }
  233. //数据处理
  234. switch (DataHead.wIdentifier)
  235. {
  236. case UI_LOAD_DB_LIST_RESULT: //列表结果
  237. {
  238. //效验消息
  239. ASSERT(DataHead.wDataSize == sizeof(CP_ControlResult));
  240. if (DataHead.wDataSize != sizeof(CP_ControlResult)) return 0;
  241. //变量定义
  242. CP_ControlResult * pControlResult = (CP_ControlResult *)cbBuffer;
  243. //失败处理
  244. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_FAILURE))
  245. {
  246. ConcludeService();
  247. return 0;
  248. }
  249. //成功处理
  250. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_SUCCESS))
  251. {
  252. //连接协调
  253. SendControlPacket(CT_CONNECT_CORRESPOND, NULL, 0);
  254. }
  255. return 0;
  256. }
  257. case UI_CORRESPOND_RESULT: //协调结果
  258. {
  259. //效验消息
  260. ASSERT(DataHead.wDataSize == sizeof(CP_ControlResult));
  261. if (DataHead.wDataSize != sizeof(CP_ControlResult)) return 0;
  262. //变量定义
  263. CP_ControlResult * pControlResult = (CP_ControlResult *)cbBuffer;
  264. //失败处理
  265. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_FAILURE))
  266. {
  267. ConcludeService();
  268. return 0;
  269. }
  270. //成功处理
  271. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_SUCCESS))
  272. {
  273. //启动网络
  274. if (StartNetworkService() == false)
  275. {
  276. ConcludeService();
  277. return 0;
  278. }
  279. //设置状态
  280. SetServiceStatus(ServiceStatus_Service);
  281. }
  282. return 0;
  283. }
  284. }
  285. return 0;
  286. }
  287. //////////////////////////////////////////////////////////////////////////////////