302 lines
6.2 KiB
C++
302 lines
6.2 KiB
C++
#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;i<wDataCount;i++)
|
|
{
|
|
if (DataBuffer[i].wDataSize>0)
|
|
{
|
|
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;i<wDataCount;i++)
|
|
{
|
|
if (DataBuffer[i].wDataSize>0)
|
|
{
|
|
//效验状态
|
|
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_dwInsertPos == m_dwTerminalPos) && ((m_dwInsertPos + dwNeedSize)>=m_dwBufferSize))
|
|
{
|
|
if (m_dwDataQueryPos>=dwNeedSize) m_dwInsertPos=0;
|
|
else throw 0;
|
|
}
|
|
|
|
//缓冲判断
|
|
if ((m_dwInsertPos<m_dwTerminalPos)&&((m_dwInsertPos+dwNeedSize)>m_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;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////
|