诸暨麻将添加redis
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 
 
 

205 řádky
5.0 KiB

  1. #include "stdafx.h"
  2. #include "QueueService.h"
  3. //////////////////////////////////////////////////////////////////////////
  4. //构造函数
  5. CQueueServiceThread::CQueueServiceThread(void)
  6. {
  7. m_hCompletionPort = NULL;
  8. memset(m_cbBuffer, 0, sizeof(m_cbBuffer));
  9. }
  10. //析构函数
  11. CQueueServiceThread::~CQueueServiceThread(void)
  12. {
  13. }
  14. //配置函数
  15. bool CQueueServiceThread::InitThread(HANDLE hCompletionPort)
  16. {
  17. //效验参数
  18. ASSERT(IsRuning() == false);
  19. ASSERT(m_hCompletionPort == NULL);
  20. //设置变量
  21. m_hCompletionPort = hCompletionPort;
  22. memset(m_cbBuffer, 0, sizeof(m_cbBuffer));
  23. return true;
  24. }
  25. //取消配置
  26. bool CQueueServiceThread::UnInitThread()
  27. {
  28. //效验参数
  29. ASSERT(IsRuning() == false);
  30. //设置变量
  31. m_hCompletionPort = NULL;
  32. memset(m_cbBuffer, 0, sizeof(m_cbBuffer));
  33. return true;
  34. }
  35. //运行函数
  36. bool CQueueServiceThread::OnEventThreadRun()
  37. {
  38. //效验参数
  39. ASSERT(m_hCompletionPort != NULL);
  40. //变量定义
  41. DWORD dwThancferred = 0;
  42. OVERLAPPED * pOverLapped = NULL;
  43. CQueueService * pQueueService = NULL;
  44. //等待完成端口
  45. if (GetQueuedCompletionStatus(m_hCompletionPort, &dwThancferred, (PULONG_PTR)&pQueueService, &pOverLapped, INFINITE))
  46. {
  47. //判断退出
  48. if (pQueueService == NULL) return false;
  49. //获取数据
  50. tagDataHead DataHead;
  51. bool bSuccess = pQueueService->GetData(DataHead, m_cbBuffer, sizeof(m_cbBuffer));
  52. ASSERT(bSuccess == true);
  53. //处理数据
  54. if (bSuccess == true)
  55. pQueueService->OnQueueServiceThread(DataHead, m_cbBuffer, DataHead.wDataSize);
  56. return true;
  57. }
  58. return false;
  59. }
  60. //////////////////////////////////////////////////////////////////////////
  61. //构造函数
  62. CQueueService::CQueueService(void)
  63. {
  64. m_bService = false;
  65. m_hCompletionPort = NULL;
  66. m_pIQueueServiceSink = NULL;
  67. }
  68. //析构函数
  69. CQueueService::~CQueueService(void)
  70. {
  71. //停止服务
  72. ConcludeService();
  73. return;
  74. }
  75. //接口查询
  76. void * CQueueService::QueryInterface(const IID & Guid, DWORD dwQueryVer)
  77. {
  78. QUERYINTERFACE(IQueueService, Guid, dwQueryVer);
  79. QUERYINTERFACE_IUNKNOWNEX(IQueueService, Guid, dwQueryVer);
  80. return NULL;
  81. }
  82. //设置接口
  83. bool CQueueService::SetQueueServiceSink(IUnknownEx * pIUnknownEx)
  84. {
  85. ASSERT(pIUnknownEx != NULL);
  86. m_pIQueueServiceSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IQueueServiceSink);
  87. ASSERT(m_pIQueueServiceSink != NULL);
  88. return (m_pIQueueServiceSink != NULL);
  89. }
  90. //负荷信息
  91. bool CQueueService::GetBurthenInfo(tagBurthenInfo & BurthenInfo)
  92. {
  93. CWHDataLocker lock(m_CriticalSection);//
  94. m_DataQueue.GetBurthenInfo(BurthenInfo);
  95. return true;
  96. }
  97. //加入数据
  98. bool CQueueService::AddToQueue(WORD wIdentifier, void * const pBuffer, WORD wDataSize)
  99. {
  100. CWHDataLocker lock(m_CriticalSection);//
  101. m_DataQueue.InsertData(wIdentifier, pBuffer, wDataSize);
  102. PostQueuedCompletionStatus(m_hCompletionPort, wDataSize, (ULONG_PTR)this, NULL);
  103. return true;
  104. }
  105. //开始服务
  106. bool CQueueService::StartService()
  107. {
  108. //效验参数
  109. ASSERT(m_bService == false);
  110. ASSERT(m_hCompletionPort == NULL);
  111. ASSERT(m_pIQueueServiceSink != NULL);
  112. //建立完成端口
  113. m_hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 1);
  114. if (m_hCompletionPort == NULL) throw TEXT("队列对象完成端口创建失败");
  115. //启动线程
  116. if (m_QueueServiceThread.InitThread(m_hCompletionPort) == false) throw TEXT("队列对象线程初始化失败");
  117. if (m_QueueServiceThread.StartThread() == false) throw TEXT("队列对象线程启动失败");
  118. // SetThreadPriority(m_QueueServiceThread.GetThreadHandle(), REALTIME_PRIORITY_CLASS);
  119. //设置参数
  120. m_bService = true;
  121. return true;
  122. }
  123. //停止服务
  124. bool CQueueService::ConcludeService()
  125. {
  126. //设置变量
  127. m_bService = false;
  128. //停止线程
  129. if (m_hCompletionPort != NULL)
  130. PostQueuedCompletionStatus(m_hCompletionPort, 0, NULL, NULL);
  131. m_QueueServiceThread.ConcludeThread(INFINITE);
  132. m_QueueServiceThread.UnInitThread();
  133. //关闭完成端口
  134. if (m_hCompletionPort != NULL)
  135. {
  136. CloseHandle(m_hCompletionPort);
  137. m_hCompletionPort = NULL;
  138. }
  139. //设置数据
  140. m_DataQueue.RemoveData(false);
  141. m_pIQueueServiceSink = NULL;
  142. return true;
  143. }
  144. //线程句柄
  145. HANDLE CQueueService::GetThreadHandle()
  146. {
  147. return m_QueueServiceThread.GetThreadHandle();
  148. }
  149. //提取数据
  150. bool CQueueService::GetData(tagDataHead & DataHead, void * pBuffer, WORD wBufferSize)
  151. {
  152. CWHDataLocker lock(m_CriticalSection);//
  153. return m_DataQueue.DistillData(DataHead, pBuffer, wBufferSize);
  154. }
  155. //数据消息
  156. void CQueueService::OnQueueServiceThread(const tagDataHead & DataHead, void * pBuffer, WORD wDataSize)
  157. {
  158. ASSERT(m_pIQueueServiceSink != NULL);
  159. try
  160. {
  161. m_pIQueueServiceSink->OnQueueServiceSink(DataHead.wIdentifier, pBuffer, DataHead.wDataSize);
  162. }
  163. catch (...) {}
  164. return;
  165. }