诸暨麻将添加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.
 
 
 
 
 
 

301 lines
7.7 KiB

  1. #include "StdAfx.h"
  2. #include "WHDataQueue.h"
  3. //////////////////////////////////////////////////////////////////////////////////
  4. //构造函数
  5. CWHDataQueue::CWHDataQueue()
  6. {
  7. //查询变量
  8. m_dwInsertPos = 0L;
  9. m_dwTerminalPos = 0L;
  10. m_dwDataQueryPos = 0L;
  11. //数据变量
  12. m_dwDataSize = 0L;
  13. m_dwDataPacketCount = 0L;
  14. //缓冲变量
  15. m_dwBufferSize = 0L;
  16. m_pDataQueueBuffer = NULL;
  17. return;
  18. }
  19. //析构函数
  20. CWHDataQueue::~CWHDataQueue()
  21. {
  22. SafeDeleteArray(m_pDataQueueBuffer);
  23. return;
  24. }
  25. //负荷信息
  26. VOID CWHDataQueue::GetBurthenInfo(tagBurthenInfo & BurthenInfo)
  27. {
  28. //设置变量
  29. BurthenInfo.dwDataSize = m_dwDataSize;
  30. BurthenInfo.dwBufferSize = m_dwBufferSize;
  31. BurthenInfo.dwDataPacketCount = m_dwDataPacketCount;
  32. return;
  33. }
  34. //插入数据
  35. bool CWHDataQueue::InsertData(WORD wIdentifier, VOID * pBuffer, WORD wDataSize)
  36. {
  37. //变量定义
  38. tagDataHead DataHead;
  39. ZeroMemory(&DataHead, sizeof(DataHead));
  40. //设置变量
  41. DataHead.wDataSize = wDataSize;
  42. DataHead.wIdentifier = wIdentifier;
  43. //调整存储
  44. if (RectifyBuffer(sizeof(DataHead)+DataHead.wDataSize) == false)
  45. {
  46. ASSERT(FALSE);
  47. return false;
  48. }
  49. //插入数据
  50. try
  51. {
  52. //拷贝数据
  53. CopyMemory(m_pDataQueueBuffer + m_dwInsertPos, &DataHead, sizeof(DataHead));
  54. //附加数据
  55. if (wDataSize > 0)
  56. {
  57. ASSERT(pBuffer != NULL);
  58. CopyMemory(m_pDataQueueBuffer + m_dwInsertPos + sizeof(DataHead), pBuffer, wDataSize);
  59. }
  60. //调整数据
  61. m_dwDataPacketCount++;
  62. m_dwDataSize += sizeof(DataHead)+wDataSize;
  63. m_dwInsertPos += sizeof(DataHead)+wDataSize;
  64. m_dwTerminalPos = __max(m_dwTerminalPos, m_dwInsertPos);
  65. return true;
  66. }
  67. catch (...)
  68. {
  69. ASSERT(FALSE);
  70. return false;
  71. }
  72. return false;
  73. }
  74. //插入数据
  75. bool CWHDataQueue::InsertData(WORD wIdentifier, tagDataBuffer DataBuffer[], WORD wDataCount)
  76. {
  77. //变量定义
  78. tagDataHead DataHead;
  79. ZeroMemory(&DataHead, sizeof(DataHead));
  80. //设置变量
  81. DataHead.wDataSize = 0;
  82. DataHead.wIdentifier = wIdentifier;
  83. //累计大小
  84. for (WORD i = 0; i<wDataCount; i++)
  85. {
  86. if (DataBuffer[i].wDataSize>0)
  87. {
  88. DataHead.wDataSize += DataBuffer[i].wDataSize;
  89. }
  90. }
  91. //调整存储
  92. if (RectifyBuffer(sizeof(DataHead)+DataHead.wDataSize) == false)
  93. {
  94. ASSERT(FALSE);
  95. return false;
  96. }
  97. //插入数据
  98. try
  99. {
  100. //拷贝数据
  101. CopyMemory(m_pDataQueueBuffer + m_dwInsertPos, &DataHead, sizeof(DataHead));
  102. //附加数据
  103. if (DataHead.wDataSize > 0)
  104. {
  105. //变量定义
  106. WORD wExcursion = sizeof(DataHead);
  107. //插入数据
  108. for (WORD i = 0; i<wDataCount; i++)
  109. {
  110. if (DataBuffer[i].wDataSize>0)
  111. {
  112. //效验状态
  113. ASSERT(DataBuffer[i].pDataBuffer != NULL);
  114. //拷贝数据
  115. CopyMemory(m_pDataQueueBuffer + m_dwInsertPos + wExcursion, DataBuffer[i].pDataBuffer, DataBuffer[i].wDataSize);
  116. //设置变量
  117. wExcursion += DataBuffer[i].wDataSize;
  118. }
  119. }
  120. }
  121. //调整数据
  122. m_dwDataPacketCount++;
  123. m_dwDataSize += sizeof(DataHead)+DataHead.wDataSize;
  124. m_dwInsertPos += sizeof(DataHead)+DataHead.wDataSize;
  125. m_dwTerminalPos = __max(m_dwTerminalPos, m_dwInsertPos);
  126. return true;
  127. }
  128. catch (...)
  129. {
  130. ASSERT(FALSE);
  131. return false;
  132. }
  133. return false;
  134. }
  135. //获取数据
  136. bool CWHDataQueue::DistillData(tagDataHead & DataHead, VOID * pBuffer, WORD wBufferSize)
  137. {
  138. //效验变量
  139. ASSERT(m_dwDataSize > 0L);
  140. ASSERT(m_dwDataPacketCount > 0);
  141. ASSERT(m_pDataQueueBuffer != NULL);
  142. //效验变量
  143. if (m_dwDataSize == 0L) return false;
  144. if (m_dwDataPacketCount == 0L) return false;
  145. //调整参数
  146. if (m_dwDataQueryPos == m_dwTerminalPos)
  147. {
  148. m_dwDataQueryPos = 0L;
  149. m_dwTerminalPos = m_dwInsertPos;
  150. }
  151. //获取指针
  152. ASSERT(m_dwBufferSize >= (m_dwDataQueryPos + sizeof(tagDataHead)));
  153. tagDataHead * pDataHead = (tagDataHead *)(m_pDataQueueBuffer + m_dwDataQueryPos);
  154. ASSERT(wBufferSize >= pDataHead->wDataSize);
  155. //获取大小
  156. WORD wPacketSize = sizeof(DataHead)+pDataHead->wDataSize;
  157. ASSERT(m_dwBufferSize >= (m_dwDataQueryPos + wPacketSize));
  158. //判断缓冲
  159. WORD wCopySize = 0;
  160. ASSERT(wBufferSize >= pDataHead->wDataSize);
  161. if (wBufferSize >= pDataHead->wDataSize) wCopySize = pDataHead->wDataSize;
  162. //拷贝数据
  163. DataHead = *pDataHead;
  164. if (DataHead.wDataSize > 0)
  165. {
  166. if (wBufferSize < pDataHead->wDataSize) DataHead.wDataSize = 0;
  167. else CopyMemory(pBuffer, pDataHead + 1, DataHead.wDataSize);
  168. }
  169. //效验参数
  170. ASSERT(wPacketSize <= m_dwDataSize);
  171. ASSERT(m_dwBufferSize >= (m_dwDataQueryPos + wPacketSize));
  172. //设置变量
  173. m_dwDataPacketCount--;
  174. m_dwDataSize -= wPacketSize;
  175. m_dwDataQueryPos += wPacketSize;
  176. return true;
  177. }
  178. //删除数据
  179. VOID CWHDataQueue::RemoveData(bool bFreeMemroy)
  180. {
  181. //设置变量
  182. m_dwDataSize = 0L;
  183. m_dwInsertPos = 0L;
  184. m_dwTerminalPos = 0L;
  185. m_dwDataQueryPos = 0L;
  186. m_dwDataPacketCount = 0L;
  187. //删除内存
  188. if (bFreeMemroy == true)
  189. {
  190. m_dwBufferSize = 0;
  191. SafeDeleteArray(m_pDataQueueBuffer);
  192. }
  193. return;
  194. }
  195. //调整存储
  196. bool CWHDataQueue::RectifyBuffer(DWORD dwNeedSize)
  197. {
  198. try
  199. {
  200. //缓冲判断
  201. if ((m_dwDataSize + dwNeedSize) > m_dwBufferSize) throw 0;
  202. //重新开始
  203. if ((m_dwInsertPos == m_dwTerminalPos) && ((m_dwInsertPos + dwNeedSize) > m_dwBufferSize))
  204. {
  205. if (m_dwDataQueryPos >= dwNeedSize) m_dwInsertPos = 0;
  206. else throw 0;
  207. }
  208. //缓冲判断
  209. if ((m_dwInsertPos<m_dwTerminalPos) && ((m_dwInsertPos + dwNeedSize)>m_dwDataQueryPos)) throw 0;
  210. }
  211. catch (...)
  212. {
  213. try
  214. {
  215. //申请内存
  216. DWORD dwRiseSize = __max(m_dwBufferSize / 2L, dwNeedSize * 10L);
  217. LPBYTE pNewQueueServiceBuffer = new BYTE[m_dwBufferSize + dwRiseSize];
  218. //错误判断
  219. ASSERT(pNewQueueServiceBuffer != NULL);
  220. if (pNewQueueServiceBuffer == NULL) return false;
  221. //拷贝数据
  222. if (m_pDataQueueBuffer != NULL)
  223. {
  224. //效验状态
  225. ASSERT(m_dwTerminalPos >= m_dwDataSize);
  226. ASSERT(m_dwTerminalPos >= m_dwDataQueryPos);
  227. //拷贝数据
  228. DWORD dwPartOneSize = m_dwTerminalPos - m_dwDataQueryPos;
  229. if (dwPartOneSize > 0L) CopyMemory(pNewQueueServiceBuffer, m_pDataQueueBuffer + m_dwDataQueryPos, dwPartOneSize);
  230. if (m_dwDataSize > dwPartOneSize)
  231. {
  232. ASSERT((m_dwInsertPos + dwPartOneSize) == m_dwDataSize);
  233. CopyMemory(pNewQueueServiceBuffer + dwPartOneSize, m_pDataQueueBuffer, m_dwInsertPos);
  234. }
  235. }
  236. //设置变量
  237. m_dwDataQueryPos = 0L;
  238. m_dwInsertPos = m_dwDataSize;
  239. m_dwTerminalPos = m_dwDataSize;
  240. m_dwBufferSize = m_dwBufferSize + dwRiseSize;
  241. //设置缓冲
  242. SafeDeleteArray(m_pDataQueueBuffer);
  243. m_pDataQueueBuffer = pNewQueueServiceBuffer;
  244. }
  245. catch (...) { return false; }
  246. }
  247. return true;
  248. }
  249. //////////////////////////////////////////////////////////////////////////////////