#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 (wBufferSizewDataSize) 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_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; } //////////////////////////////////////////////////////////////////////////////////