诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

286 lines
9.5 KiB

  1. #ifndef QUEUE_SERVICE_EVENT_HEAD_FILE
  2. #define QUEUE_SERVICE_EVENT_HEAD_FILE
  3. #pragma once
  4. #include "KernelEngineHead.h"
  5. #include "QueueService.h"
  6. //////////////////////////////////////////////////////////////////////////
  7. //数据队列事件
  8. class CQueueServiceEvent
  9. {
  10. //变量定义
  11. public:
  12. CCriticalSection m_CriticalSection; //同步锁定
  13. CQueueService m_pIQueueService; //队列接口
  14. BYTE m_cbBuffer[MAX_ASYNCHRONISM_DATA]; //接收缓冲
  15. //函数定义
  16. public:
  17. //构造函数
  18. CQueueServiceEvent()
  19. {
  20. }
  21. //析构函数
  22. virtual ~CQueueServiceEvent()
  23. {
  24. }
  25. //线程句柄
  26. HANDLE GetThreadHandle()
  27. {
  28. return m_pIQueueService.GetThreadHandle();
  29. }
  30. //管理函数
  31. public:
  32. //设置接口
  33. bool SetQueueServiceSink(IUnknownEx * pIUnknownEx)
  34. {
  35. if (NULL != pIUnknownEx)
  36. {
  37. bool bRet = m_pIQueueService.SetQueueServiceSink(pIUnknownEx);
  38. if (bRet)
  39. bRet = m_pIQueueService.StartService();
  40. return bRet;
  41. }
  42. else
  43. {
  44. m_pIQueueService.ConcludeService();
  45. return true;
  46. }
  47. }
  48. //通知函数
  49. public:
  50. //定时器事件
  51. bool PostTimerEvent(DWORD wTimerID, WPARAM wBindParam)
  52. {
  53. //缓冲锁定
  54. CWHDataLocker lock(m_CriticalSection);
  55. //投递消息
  56. NTY_TimerEvent * pTimerEvent = (NTY_TimerEvent *)m_cbBuffer;
  57. pTimerEvent->dwTimerID = wTimerID;
  58. pTimerEvent->dwBindParameter = wBindParam;
  59. m_pIQueueService.AddToQueue(EVENT_TIMER, m_cbBuffer, sizeof(NTY_TimerEvent));
  60. return true;
  61. }
  62. //数据库事件
  63. bool PostDataBaseEvent(WORD wRequestID, DWORD dwContextID, const void * pDataBuffer, WORD wDataSize)
  64. {
  65. ASSERT((wDataSize + sizeof(NTY_DataBaseEvent)) <= MAX_ASYNCHRONISM_DATA);
  66. if ((wDataSize + sizeof(NTY_DataBaseEvent)) > MAX_ASYNCHRONISM_DATA) return false;
  67. //缓冲锁定
  68. CWHDataLocker lock(m_CriticalSection);
  69. //投递消息
  70. NTY_DataBaseEvent * pDataBaseEvent = (NTY_DataBaseEvent *)m_cbBuffer;
  71. pDataBaseEvent->wRequestID = wRequestID;
  72. pDataBaseEvent->dwContextID = dwContextID;
  73. if (wDataSize > 0)
  74. {
  75. ASSERT(pDataBuffer != NULL);
  76. CopyMemory(m_cbBuffer + sizeof(NTY_DataBaseEvent), pDataBuffer, wDataSize);
  77. }
  78. m_pIQueueService.AddToQueue(EVENT_DATABASE, m_cbBuffer, sizeof(NTY_DataBaseEvent)+wDataSize);
  79. return true;
  80. }
  81. //数据库控制事件
  82. bool PostControlEvent(WORD wControlID, VOID * pData, WORD wDataSize)
  83. {
  84. //效验参数
  85. ASSERT((wDataSize + sizeof(NTY_ControlEvent)) <= MAX_ASYNCHRONISM_DATA);
  86. if ((wDataSize + sizeof(NTY_ControlEvent)) > MAX_ASYNCHRONISM_DATA) return false;
  87. //缓冲锁定
  88. CWHDataLocker lock(m_CriticalSection);
  89. //投递消息
  90. NTY_ControlEvent * pDataBaseEvent = (NTY_ControlEvent *)m_cbBuffer;
  91. pDataBaseEvent->wControlID = wControlID;
  92. if (wDataSize > 0)
  93. {
  94. ASSERT(pData != NULL);
  95. CopyMemory(m_cbBuffer + sizeof(NTY_ControlEvent), pData, wDataSize);
  96. }
  97. m_pIQueueService.AddToQueue(EVENT_CONTROL, m_cbBuffer, sizeof(NTY_ControlEvent)+wDataSize);
  98. return true;
  99. }
  100. //SOCKET引擎
  101. //////////////////////////////////////////////////////////////////////////
  102. //网络应答事件
  103. bool PostNetworkAcceptEvent(DWORD dwSocketID, DWORD dwClientIP)
  104. {
  105. //效验参数
  106. ASSERT(sizeof(NTY_TCPNetworkAcceptEvent) <= MAX_ASYNCHRONISM_DATA);
  107. if (sizeof(NTY_TCPNetworkAcceptEvent) > MAX_ASYNCHRONISM_DATA) return false;
  108. //缓冲锁定
  109. CWHDataLocker lock(m_CriticalSection);
  110. //投递消息
  111. NTY_TCPNetworkAcceptEvent * pSocketAcceptEvent = (NTY_TCPNetworkAcceptEvent *)m_cbBuffer;
  112. pSocketAcceptEvent->dwSocketID = dwSocketID;
  113. pSocketAcceptEvent->dwClientAddr = dwClientIP;
  114. m_pIQueueService.AddToQueue(EVENT_TCP_NETWORK_ACCEPT, m_cbBuffer, sizeof(NTY_TCPNetworkAcceptEvent));
  115. return true;
  116. }
  117. //同步数据到业务线程
  118. bool PostChangeData(int iCommend, DWORD dwContextID, void * pData, WORD wDataSize)
  119. {
  120. //缓冲锁定
  121. CWHDataLocker lock(m_CriticalSection);
  122. int *p = (int*)m_cbBuffer;
  123. *p = iCommend;
  124. int* pSecond = p + 1;
  125. *pSecond = dwContextID;
  126. CopyMemory(m_cbBuffer + 8, pData, wDataSize);
  127. //投递消息
  128. m_pIQueueService.AddToQueue(EVENT_TCP_TONGBU, m_cbBuffer, wDataSize + 8);
  129. return true;
  130. }
  131. //网络读取事件
  132. bool PostNetworkReadEvent(DWORD dwSocketID, TCP_Command Command, const void * pDataBuffer, WORD wDataSize)
  133. {
  134. //效验参数
  135. ASSERT((wDataSize + sizeof(NTY_TCPNetworkReadEvent)) <= MAX_ASYNCHRONISM_DATA);
  136. if ((wDataSize + sizeof(NTY_TCPNetworkReadEvent)) > MAX_ASYNCHRONISM_DATA) return false;
  137. //缓冲锁定
  138. CWHDataLocker lock(m_CriticalSection);
  139. //投递消息
  140. NTY_TCPNetworkReadEvent * pSocketReadEvent = (NTY_TCPNetworkReadEvent *)m_cbBuffer;
  141. pSocketReadEvent->dwSocketID = dwSocketID;
  142. pSocketReadEvent->Command = Command;
  143. pSocketReadEvent->wDataSize = wDataSize;
  144. if (wDataSize > 0)
  145. {
  146. ASSERT(pDataBuffer != NULL);
  147. CopyMemory(m_cbBuffer + sizeof(NTY_TCPNetworkReadEvent), pDataBuffer, wDataSize);
  148. }
  149. m_pIQueueService.AddToQueue(EVENT_TCP_NETWORK_READ, m_cbBuffer, sizeof(NTY_TCPNetworkReadEvent)+wDataSize);
  150. return true;
  151. }
  152. //网络关闭事件
  153. bool PostNetworkCloseEvent(DWORD dwSocketID, DWORD dwClientIP, DWORD dwActiveTime)
  154. {
  155. //效验参数
  156. ASSERT(sizeof(NTY_TCPNetworkShutEvent) <= MAX_ASYNCHRONISM_DATA);
  157. if (sizeof(NTY_TCPNetworkShutEvent) > MAX_ASYNCHRONISM_DATA) return false;
  158. //缓冲锁定
  159. CWHDataLocker lock(m_CriticalSection);
  160. //投递消息
  161. NTY_TCPNetworkShutEvent * pSocketCloseEvent = (NTY_TCPNetworkShutEvent *)m_cbBuffer;
  162. pSocketCloseEvent->dwSocketID = dwSocketID;
  163. pSocketCloseEvent->dwActiveTime = dwActiveTime;
  164. pSocketCloseEvent->dwClientAddr = dwClientIP;
  165. m_pIQueueService.AddToQueue(EVENT_TCP_NETWORK_SHUT, m_cbBuffer, sizeof(NTY_TCPNetworkShutEvent));
  166. return true;
  167. }
  168. //SOCKET服务
  169. //////////////////////////////////////////////////////////////////////////
  170. //网络关闭事件
  171. bool PostTCPSocketCloseEvent(WORD wServiceID, BYTE cbShutReason)
  172. {
  173. //效验参数
  174. ASSERT(sizeof(NTY_TCPSocketShutEvent) <= MAX_ASYNCHRONISM_DATA);
  175. if (sizeof(NTY_TCPSocketShutEvent) > MAX_ASYNCHRONISM_DATA) return false;
  176. //缓冲锁定
  177. CWHDataLocker lock(m_CriticalSection);
  178. //投递消息
  179. NTY_TCPSocketShutEvent * pSocketCloseEvent = (NTY_TCPSocketShutEvent *)m_cbBuffer;
  180. pSocketCloseEvent->wServiceID = wServiceID;
  181. pSocketCloseEvent->cbShutReason = cbShutReason;
  182. return m_pIQueueService.AddToQueue(EVENT_TCP_SOCKET_SHUT, m_cbBuffer, sizeof(NTY_TCPSocketShutEvent));
  183. }
  184. //网络关闭事件
  185. bool PostTCPSocketReadEvent(WORD wServiceID, TCP_Command Command, const void * pDataBuffer, WORD wDataSize)
  186. {
  187. //效验参数
  188. ASSERT((wDataSize + sizeof(NTY_TCPSocketReadEvent)) <= MAX_ASYNCHRONISM_DATA);
  189. if ((wDataSize + sizeof(NTY_TCPSocketReadEvent)) > MAX_ASYNCHRONISM_DATA) return false;
  190. //缓冲锁定
  191. CWHDataLocker lock(m_CriticalSection);
  192. //投递消息
  193. NTY_TCPSocketReadEvent * pSocketCloseEvent = (NTY_TCPSocketReadEvent *)m_cbBuffer;
  194. pSocketCloseEvent->wDataSize = wDataSize;
  195. pSocketCloseEvent->wServiceID = wServiceID;
  196. pSocketCloseEvent->Command = Command;
  197. if (wDataSize > 0)
  198. {
  199. ASSERT(pDataBuffer != NULL);
  200. CopyMemory(m_cbBuffer + sizeof(NTY_TCPSocketReadEvent), pDataBuffer, wDataSize);
  201. }
  202. m_pIQueueService.AddToQueue(EVENT_TCP_SOCKET_READ, m_cbBuffer, sizeof(NTY_TCPSocketReadEvent)+wDataSize);
  203. return true;
  204. }
  205. //网络应答事件 --websocket新增
  206. bool PostNetworkForegroundEvent(DWORD dwSocketID, bool foreground)
  207. {
  208. //效验参数
  209. ASSERT(sizeof(NTY_TCPNetworkForegroundEvent) <= MAX_ASYNCHRONISM_DATA);
  210. if (sizeof(NTY_TCPNetworkForegroundEvent) > MAX_ASYNCHRONISM_DATA) return false;
  211. //缓冲锁定
  212. CWHDataLocker lock(m_CriticalSection);
  213. //投递消息
  214. NTY_TCPNetworkForegroundEvent * pSocketForegroundEvent = (NTY_TCPNetworkForegroundEvent *)m_cbBuffer;
  215. pSocketForegroundEvent->dwSocketID = dwSocketID;
  216. pSocketForegroundEvent->bForeground = foreground;
  217. m_pIQueueService.AddToQueue(EVENT_TCP_NETWORK_FOREGROUND, m_cbBuffer, sizeof(NTY_TCPNetworkForegroundEvent));
  218. return true;
  219. }
  220. //网络关闭事件
  221. bool PostTCPSocketConnectedEvent(WORD wServiceID, INT nErrorCode)
  222. {
  223. //效验参数
  224. ASSERT(sizeof(NTY_TCPSocketLinkEvent) <= MAX_ASYNCHRONISM_DATA);
  225. if (sizeof(NTY_TCPSocketLinkEvent) > MAX_ASYNCHRONISM_DATA) return false;
  226. //缓冲锁定
  227. CWHDataLocker lock(m_CriticalSection);
  228. //投递消息
  229. NTY_TCPSocketLinkEvent * pSocketCloseEvent = (NTY_TCPSocketLinkEvent *)m_cbBuffer;
  230. pSocketCloseEvent->wServiceID = wServiceID;
  231. pSocketCloseEvent->nErrorCode = nErrorCode;
  232. m_pIQueueService.AddToQueue(EVENT_TCP_SOCKET_LINK, m_cbBuffer, sizeof(NTY_TCPSocketLinkEvent));
  233. return true;
  234. }
  235. };
  236. //////////////////////////////////////////////////////////////////////////
  237. #endif