诸暨麻将添加redis
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 
 

344 linhas
11 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. return true;
  79. }
  80. //设置接口
  81. bool CServiceUnits::SetServiceUnitsSink(IServiceUnitsSink * pIServiceUnitsSink)
  82. {
  83. //设置变量
  84. m_pIServiceUnitsSink = pIServiceUnitsSink;
  85. return true;
  86. }
  87. //投递请求
  88. bool CServiceUnits::PostControlRequest(WORD wIdentifier, VOID * pData, WORD wDataSize)
  89. {
  90. //状态判断
  91. ASSERT(IsWindow(m_hWnd));
  92. if (IsWindow(m_hWnd) == FALSE) return false;
  93. //插入队列
  94. CWHDataLocker DataLocker(m_CriticalSection);
  95. if (m_DataQueue.InsertData(wIdentifier, pData, wDataSize) == false) return false;
  96. //发送消息
  97. PostMessage(WM_UICONTROL_REQUEST, wIdentifier, wDataSize);
  98. return true;
  99. }
  100. //配置组件
  101. bool CServiceUnits::InitializeService()
  102. {
  103. //加载参数
  104. m_InitParameter.LoadInitParameter();
  105. //创建组件
  106. if ((m_TimerEngine.GetInterface() == NULL) && (m_TimerEngine.CreateInstance() == false)) return false;
  107. if ((m_AttemperEngine.GetInterface() == NULL) && (m_AttemperEngine.CreateInstance() == false)) return false;
  108. if ((m_DataBaseEngine.GetInterface() == NULL) && (m_DataBaseEngine.CreateInstance() == false)) return false;
  109. if ((m_TCPNetworkEngine.GetInterface() == NULL) && (m_TCPNetworkEngine.CreateInstance() == false)) return false;
  110. if ((m_TCPSocketService.GetInterface() == NULL) && (m_TCPSocketService.CreateInstance() == false)) return false;
  111. //组件接口
  112. IUnknownEx * pIAttemperEngine = m_AttemperEngine.GetInterface();
  113. IUnknownEx * pITCPNetworkEngine = m_TCPNetworkEngine.GetInterface();
  114. IUnknownEx * pIAttemperEngineSink = QUERY_OBJECT_INTERFACE(m_AttemperEngineSink, IUnknownEx);
  115. //数据引擎
  116. IUnknownEx * pIDataBaseEngineSink[CountArray(m_DataBaseEngineSink)];
  117. for (WORD i = 0; i < CountArray(pIDataBaseEngineSink); i++) pIDataBaseEngineSink[i] = QUERY_OBJECT_INTERFACE(m_DataBaseEngineSink[i], IUnknownEx);
  118. //内核组件
  119. if (m_TimerEngine->SetTimerEngineEvent(pIAttemperEngine) == false) return false;
  120. if (m_AttemperEngine->SetNetworkEngine(pITCPNetworkEngine) == false) return false;
  121. if (m_AttemperEngine->SetAttemperEngineSink(pIAttemperEngineSink) == false) return false;
  122. if (m_TCPNetworkEngine->SetTCPNetworkEngineEvent(pIAttemperEngine) == false) return false;
  123. if (m_DataBaseEngine->SetDataBaseEngineSink(pIDataBaseEngineSink, CountArray(pIDataBaseEngineSink)) == false) return false;
  124. //协调服务
  125. if (m_TCPSocketService->SetServiceID(NETWORK_CORRESPOND) == false) return false;
  126. if (m_TCPSocketService->SetTCPSocketEvent(pIAttemperEngine) == false) return false;
  127. //调度回调
  128. m_AttemperEngineSink.m_pInitParameter = &m_InitParameter;
  129. m_AttemperEngineSink.m_pITimerEngine = m_TimerEngine.GetInterface();
  130. m_AttemperEngineSink.m_pIDataBaseEngine = m_DataBaseEngine.GetInterface();
  131. m_AttemperEngineSink.m_pITCPNetworkEngine = m_TCPNetworkEngine.GetInterface();
  132. m_AttemperEngineSink.m_pITCPSocketService = m_TCPSocketService.GetInterface();
  133. //数据库回调
  134. for (INT i = 0; i < CountArray(m_DataBaseEngineSink); i++)
  135. {
  136. m_DataBaseEngineSink[i].m_pInitParameter = &m_InitParameter;
  137. m_DataBaseEngineSink[i].m_pIDataBaseEngineEvent = QUERY_OBJECT_PTR_INTERFACE(pIAttemperEngine, IDataBaseEngineEvent);
  138. }
  139. //配置网络
  140. WORD wMaxConnect = m_InitParameter.m_wMaxConnect;
  141. WORD wServicePort = m_InitParameter.m_wServicePort;
  142. if (m_TCPNetworkEngine->SetServiceParameter(wServicePort, wMaxConnect, szCompilation) == false) return false;
  143. return true;
  144. }
  145. //启动内核
  146. bool CServiceUnits::StartKernelService()
  147. {
  148. //时间引擎
  149. if (m_TimerEngine->StartService() == false)
  150. {
  151. ASSERT(FALSE);
  152. return false;
  153. }
  154. //调度引擎
  155. if (m_AttemperEngine->StartService() == false)
  156. {
  157. ASSERT(FALSE);
  158. return false;
  159. }
  160. //数据引擎
  161. if (m_DataBaseEngine->StartService() == false)
  162. {
  163. ASSERT(FALSE);
  164. return false;
  165. }
  166. //协调引擎
  167. if (m_TCPSocketService->StartService() == false)
  168. {
  169. ASSERT(FALSE);
  170. return false;
  171. }
  172. return true;
  173. }
  174. //启动网络
  175. bool CServiceUnits::StartNetworkService()
  176. {
  177. //网络引擎
  178. if (m_TCPNetworkEngine->StartService() == false)
  179. {
  180. ASSERT(FALSE);
  181. return false;
  182. }
  183. return true;
  184. }
  185. //设置状态
  186. bool CServiceUnits::SetServiceStatus(enServiceStatus ServiceStatus)
  187. {
  188. //状态判断
  189. if (m_ServiceStatus != ServiceStatus)
  190. {
  191. //错误通知
  192. if ((m_ServiceStatus != ServiceStatus_Service) && (ServiceStatus == ServiceStatus_Stop))
  193. {
  194. LPCTSTR pszString = TEXT("服务启动失败");
  195. CTraceService::TraceString(pszString, TraceLevel_Exception);
  196. }
  197. //设置变量
  198. m_ServiceStatus = ServiceStatus;
  199. //状态通知
  200. ASSERT(m_pIServiceUnitsSink != NULL);
  201. if (m_pIServiceUnitsSink != NULL) m_pIServiceUnitsSink->OnServiceUnitsStatus(m_ServiceStatus);
  202. }
  203. return true;
  204. }
  205. //发送控制
  206. bool CServiceUnits::SendControlPacket(WORD wControlID, VOID * pData, WORD wDataSize)
  207. {
  208. //状态效验
  209. ASSERT(m_AttemperEngine.GetInterface() != NULL);
  210. if (m_AttemperEngine.GetInterface() == NULL) return false;
  211. //发送控制
  212. m_AttemperEngine->OnEventControl(wControlID, pData, wDataSize);
  213. return true;
  214. }
  215. //控制消息
  216. LRESULT CServiceUnits::OnUIControlRequest(WPARAM wParam, LPARAM lParam)
  217. {
  218. //变量定义
  219. tagDataHead DataHead;
  220. BYTE cbBuffer[MAX_ASYNCHRONISM_DATA];
  221. //提取数据
  222. CWHDataLocker DataLocker(m_CriticalSection);
  223. if (m_DataQueue.DistillData(DataHead, cbBuffer, sizeof(cbBuffer)) == false)
  224. {
  225. ASSERT(FALSE);
  226. return NULL;
  227. }
  228. //数据处理
  229. switch (DataHead.wIdentifier)
  230. {
  231. case UI_LOAD_DB_LIST_RESULT: //列表结果
  232. {
  233. //效验消息
  234. ASSERT(DataHead.wDataSize == sizeof(CP_ControlResult));
  235. if (DataHead.wDataSize != sizeof(CP_ControlResult)) return 0;
  236. //变量定义
  237. CP_ControlResult * pControlResult = (CP_ControlResult *)cbBuffer;
  238. //失败处理
  239. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_FAILURE))
  240. {
  241. ConcludeService();
  242. return 0;
  243. }
  244. //成功处理
  245. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_SUCCESS))
  246. {
  247. //连接协调
  248. SendControlPacket(CT_CONNECT_CORRESPOND, NULL, 0);
  249. }
  250. return 0;
  251. }
  252. case UI_CORRESPOND_RESULT: //协调结果
  253. {
  254. //效验消息
  255. ASSERT(DataHead.wDataSize == sizeof(CP_ControlResult));
  256. if (DataHead.wDataSize != sizeof(CP_ControlResult)) return 0;
  257. //变量定义
  258. CP_ControlResult * pControlResult = (CP_ControlResult *)cbBuffer;
  259. //失败处理
  260. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_FAILURE))
  261. {
  262. ConcludeService();
  263. return 0;
  264. }
  265. //成功处理
  266. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_SUCCESS))
  267. {
  268. //启动网络
  269. if (StartNetworkService() == false)
  270. {
  271. ConcludeService();
  272. return 0;
  273. }
  274. //设置状态
  275. SetServiceStatus(ServiceStatus_Service);
  276. }
  277. return 0;
  278. }
  279. }
  280. return 0;
  281. }
  282. //////////////////////////////////////////////////////////////////////////////////