📄 cbuffer.cpp.bak
字号:
/********************************************************
CBuffer.c -- Main File of Buffer Class
********************************************************/
#include "stdafx.h"
#include "CBuffer.h"
CBuffer::CBuffer(int nUnitSize,int nUnitNum, BOOL bSem)
{
m_nUnitSize = nUnitSize;
m_nUnitNum = nUnitNum;
if(bSem)
m_hSemaphore = CreateSemaphore(NULL,0,m_nUnitNum,NULL);
else
m_hSemaphore = 0;
m_hMutexRead = CreateMutex(NULL,TRUE,NULL);
m_hMutexWrite = CreateMutex(NULL,TRUE,NULL);
m_nCurrent = m_nHead = m_nTail = 0;
m_chBody = new unsigned char[nUnitSize * (nUnitNum + 1)];
}
CBuffer::~CBuffer()
{
if(m_hRead)
CloseHandle(m_hRead);
if(m_hWrite)
CloseHandle(m_hWrite);
if(m_hSemaphore)
CloseHandle(m_hSemaphore);
delete(m_chBody);
}
int CBuffer::PutTo(unsigned char * Source, int nSourceSize)
{
int nLength = 0;
WaitForSingleObject(m_hMutexWrite,1000);
if(!IsFull())//不满
{
nLength = (nSourceSize < m_nUnitSize)?nSourceSize:m_nUnitSize;
memcpy((m_chBody+(m_nUnitSize * m_nHead)),Source,nLength);
m_nHead = INC(m_nHead);
ReleaseSemaphore(m_hSemaphore,1,NULL);
}
ReleaseMutex(m_hMutexWrite);
return nLength;
}
int CBuffer::Append(unsigned char * Source, int nSourceSize, BOOL bFinish)
{//从上一次填充指针继续填写,到bFinish和溢出更新指针
int nLength;
nLength = (nSourceSize < (m_nUnitSize - m_nCurrent))?nSourceSize:(m_nUnitSize - m_nCurrent);
WaitForSingleObject(m_hMutexWrite,1000);
if(m_nCurrent == 0)//当前指向0表示是新的一帧
{
if(!IsFull())//不满
{
memcpy((m_chBody+(m_nUnitSize * m_nHead)),Source,nLength);
m_nCurrent += nLength;
}else
nLength = 0;
}else//表示从前次中间开始向后加
{
memcpy((m_chBody+(m_nUnitSize*m_nHead)+m_nCurrent),Source,nLength);
m_nCurrent += nLength;
}
if(m_nCurrent >= (m_nUnitSize - 1))
{
m_nHead = INC(m_nHead);
ReleaseSemaphore(m_hSemaphore,1,NULL);
}
ReleaseMutex(m_hMutexWrite);
return nLength;
}
int CBuffer::GetFrom(unsigned char *Dest, int nDestSize)
{
int nLength = 0;
if(m_hSemaphore)
WaitForSingleObject(m_hSemaphore,-1);
WaitForSingleObject(m_hMutexRead,1000);
if(!IsEmpty())//不空
{
nLength = (nDestSize < m_nUnitSize)?nDestSize:m_nUnitSize;
memcpy(Dest,m_chBody+(m_nUnitSize * m_nTail),nLength);
m_nTail = INC(m_nTail);
}
ReleaseMutex(m_hMutexRead);
return nLength;
}
BOOL CBuffer::Unlock()
{
return ReleaseSemaphore(m_hSemaphore,1,NULL);
}
BOOL CBuffer::Clear()
{
BOOL bRtnValue = TRUE;
if(WaitForSingleObject(m_hMutexRead,1000) == WAIT_OBJECT_0)
{
if(WaitForSingleObject(m_hMutexWrite,1000) == WAIT_OBJECT_0)
{
//Clear the Buffer
m_nHead = m_nTail = 0;
ReleaseMutex(m_hMutexWrite);
}
else
bRtnValue = FALSE;
ReleaseMutex(m_hMutexRead);
}
else
bRtnValue = FALSE;
return bRtnValue;
}
BOOL CBuffer::NewSize(int nNewUnitSize, int nNewUnitNum)
{
BOOL bRtnValue = TRUE;
if(WaitForSingleObject(m_hMutexRead,1000) == WAIT_OBJECT_0)
{
if(WaitForSingleObject(m_hMutexWrite,1000) == WAIT_OBJECT_0)
{
//Clear the Buffer and adjust Size
m_nHead = m_nTail = 0;
delete(m_chBody);
m_nUnitNum = nNewUnitNum;
m_nUnitSize = nNewUnitSize;
m_chBody = new unsigned char[nNewUnitSize * (nNewUnitNum + 1)];
ReleaseMutex(m_hMutexWrite);
}
else
bRtnValue = FALSE;
ReleaseMutex(m_hMutexRead);
}
else
bRtnValue = FALSE;
return bRtnValue;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -