#include "StdAfx.h" #include "WHDataQueue.h" ////////////////////////////////////////////////////////////////////////////////// //构造函数 CWHDataQueue::CWHDataQueue() { //查询变量 m_dwInsertPos = 0L; m_dwTerminalPos = 0L; m_dwDataQueryPos = 0L; //数据变量 m_dwDataSize = 0L; m_dwDataPacketCount = 0L; //缓冲变量 m_dwBufferSize = 0L; m_pDataQueueBuffer = NULL; return; } //析构函数 CWHDataQueue::~CWHDataQueue() { SafeDeleteArray(m_pDataQueueBuffer); return; } //负荷信息 VOID CWHDataQueue::GetBurthenInfo(tagBurthenInfo & BurthenInfo) { //设置变量 BurthenInfo.dwDataSize = m_dwDataSize; BurthenInfo.dwBufferSize = m_dwBufferSize; BurthenInfo.dwDataPacketCount = m_dwDataPacketCount; return; } //插入数据 bool CWHDataQueue::InsertData(WORD wIdentifier, VOID * pBuffer, WORD wDataSize) { //变量定义 tagDataHead DataHead; ZeroMemory(&DataHead, sizeof(DataHead)); //设置变量 DataHead.wDataSize = wDataSize; DataHead.wIdentifier = wIdentifier; //调整存储 if (RectifyBuffer(sizeof(DataHead)+DataHead.wDataSize) == false) { ASSERT(FALSE); return false; } //插入数据 try { //拷贝数据 CopyMemory(m_pDataQueueBuffer + m_dwInsertPos, &DataHead, sizeof(DataHead)); //附加数据 if (wDataSize > 0) { ASSERT(pBuffer != NULL); CopyMemory(m_pDataQueueBuffer + m_dwInsertPos + sizeof(DataHead), pBuffer, wDataSize); } //调整数据 m_dwDataPacketCount++; m_dwDataSize += sizeof(DataHead)+wDataSize; m_dwInsertPos += sizeof(DataHead)+wDataSize; m_dwTerminalPos = __max(m_dwTerminalPos, m_dwInsertPos); return true; } catch (...) { ASSERT(FALSE); return false; } return false; } //插入数据 bool CWHDataQueue::InsertData(WORD wIdentifier, tagDataBuffer DataBuffer[], WORD wDataCount) { //变量定义 tagDataHead DataHead; ZeroMemory(&DataHead, sizeof(DataHead)); //设置变量 DataHead.wDataSize = 0; DataHead.wIdentifier = wIdentifier; //累计大小 for (WORD i = 0; i0) { DataHead.wDataSize += DataBuffer[i].wDataSize; } } //调整存储 if (RectifyBuffer(sizeof(DataHead)+DataHead.wDataSize) == false) { ASSERT(FALSE); return false; } //插入数据 try { //拷贝数据 CopyMemory(m_pDataQueueBuffer + m_dwInsertPos, &DataHead, sizeof(DataHead)); //附加数据 if (DataHead.wDataSize > 0) { //变量定义 WORD wExcursion = sizeof(DataHead); //插入数据 for (WORD i = 0; i0) { //效验状态 ASSERT(DataBuffer[i].pDataBuffer != NULL); //拷贝数据 CopyMemory(m_pDataQueueBuffer + m_dwInsertPos + wExcursion, DataBuffer[i].pDataBuffer, DataBuffer[i].wDataSize); //设置变量 wExcursion += DataBuffer[i].wDataSize; } } } //调整数据 m_dwDataPacketCount++; m_dwDataSize += sizeof(DataHead)+DataHead.wDataSize; m_dwInsertPos += sizeof(DataHead)+DataHead.wDataSize; m_dwTerminalPos = __max(m_dwTerminalPos, m_dwInsertPos); return true; } catch (...) { ASSERT(FALSE); return false; } return false; } //获取数据 bool CWHDataQueue::DistillData(tagDataHead & DataHead, VOID * pBuffer, WORD wBufferSize) { //效验变量 ASSERT(m_dwDataSize > 0L); ASSERT(m_dwDataPacketCount > 0); ASSERT(m_pDataQueueBuffer != NULL); //效验变量 if (m_dwDataSize == 0L) return false; if (m_dwDataPacketCount == 0L) return false; //调整参数 if (m_dwDataQueryPos == m_dwTerminalPos) { m_dwDataQueryPos = 0L; m_dwTerminalPos = m_dwInsertPos; } //获取指针 ASSERT(m_dwBufferSize >= (m_dwDataQueryPos + sizeof(tagDataHead))); tagDataHead * pDataHead = (tagDataHead *)(m_pDataQueueBuffer + m_dwDataQueryPos); ASSERT(wBufferSize >= pDataHead->wDataSize); //获取大小 WORD wPacketSize = sizeof(DataHead)+pDataHead->wDataSize; ASSERT(m_dwBufferSize >= (m_dwDataQueryPos + wPacketSize)); //判断缓冲 WORD wCopySize = 0; ASSERT(wBufferSize >= pDataHead->wDataSize); if (wBufferSize >= pDataHead->wDataSize) wCopySize = pDataHead->wDataSize; //拷贝数据 DataHead = *pDataHead; if (DataHead.wDataSize > 0) { if (wBufferSize < pDataHead->wDataSize) DataHead.wDataSize = 0; else CopyMemory(pBuffer, pDataHead + 1, DataHead.wDataSize); } //效验参数 ASSERT(wPacketSize <= m_dwDataSize); ASSERT(m_dwBufferSize >= (m_dwDataQueryPos + wPacketSize)); //设置变量 m_dwDataPacketCount--; m_dwDataSize -= wPacketSize; m_dwDataQueryPos += wPacketSize; return true; } //删除数据 VOID CWHDataQueue::RemoveData(bool bFreeMemroy) { //设置变量 m_dwDataSize = 0L; m_dwInsertPos = 0L; m_dwTerminalPos = 0L; m_dwDataQueryPos = 0L; m_dwDataPacketCount = 0L; //删除内存 if (bFreeMemroy == true) { m_dwBufferSize = 0; SafeDeleteArray(m_pDataQueueBuffer); } return; } //调整存储 bool CWHDataQueue::RectifyBuffer(DWORD dwNeedSize) { try { //缓冲判断 if ((m_dwDataSize + dwNeedSize) > m_dwBufferSize) throw 0; //重新开始 if ((m_dwInsertPos == m_dwTerminalPos) && ((m_dwInsertPos + dwNeedSize) > m_dwBufferSize)) { if (m_dwDataQueryPos >= dwNeedSize) m_dwInsertPos = 0; else throw 0; } //缓冲判断 if ((m_dwInsertPosm_dwDataQueryPos)) throw 0; } catch (...) { try { //申请内存 DWORD dwRiseSize = __max(m_dwBufferSize / 2L, dwNeedSize * 10L); LPBYTE pNewQueueServiceBuffer = new BYTE[m_dwBufferSize + dwRiseSize]; //错误判断 ASSERT(pNewQueueServiceBuffer != NULL); if (pNewQueueServiceBuffer == NULL) return false; //拷贝数据 if (m_pDataQueueBuffer != NULL) { //效验状态 ASSERT(m_dwTerminalPos >= m_dwDataSize); ASSERT(m_dwTerminalPos >= m_dwDataQueryPos); //拷贝数据 DWORD dwPartOneSize = m_dwTerminalPos - m_dwDataQueryPos; if (dwPartOneSize > 0L) CopyMemory(pNewQueueServiceBuffer, m_pDataQueueBuffer + m_dwDataQueryPos, dwPartOneSize); if (m_dwDataSize > dwPartOneSize) { ASSERT((m_dwInsertPos + dwPartOneSize) == m_dwDataSize); CopyMemory(pNewQueueServiceBuffer + dwPartOneSize, m_pDataQueueBuffer, m_dwInsertPos); } } //设置变量 m_dwDataQueryPos = 0L; m_dwInsertPos = m_dwDataSize; m_dwTerminalPos = m_dwDataSize; m_dwBufferSize = m_dwBufferSize + dwRiseSize; //设置缓冲 SafeDeleteArray(m_pDataQueueBuffer); m_pDataQueueBuffer = pNewQueueServiceBuffer; } catch (...) { return false; } } return true; } //////////////////////////////////////////////////////////////////////////////////