⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 buffer.cpp

📁 一个缓冲区管理类
💻 CPP
字号:
/******************************************************************************
    CopyRight (c) 2000-2006 南京南自信息技术有限公司
    All rights reserved.

    文件名称:buffer.cpp
    文件标识:缓冲区类
    文件摘要:缓冲区实现文件

    作    者:王强
    建立日期:2006.09.06
    完成日期:2006.09.11
    当前版本:1.0

    修订版本:未修订
    作    者:
    完成日期:
******************************************************************************/
#include "buffer.h"

/******************************************************************************
    函 数 名:TBuffer
    参    数:
        参数类型        参数性质    参数名          描述
    返回类型:
    返 回 值:
    目    的:构造函数
    说    明:
    记    录:日期时间            作  者    备注
              2006.09.06          王  强    编制程序
******************************************************************************/
TBuffer::TBuffer(int iSize)
    :m_iSize(iSize),m_usReadPos(0),m_usWritePos(1)
{
    for(int i=0;i<m_iSize;++i)
    {
        m_vct.push_back(new TWQFrame);
    }
    ::InitializeCriticalSection(&m_cs);
}

/******************************************************************************
    函 数 名:~TBuffer
    参    数:
        参数类型        参数性质    参数名          描述
    返回类型:
    返 回 值:
    目    的:析构函数
    说    明:
    记    录:日期时间            作  者    备注
              2006.09.06          王  强    编制程序
******************************************************************************/
TBuffer::~TBuffer(void)
{
    ::DeleteCriticalSection(&m_cs);
    for(int i=0;i<m_vct.size();++i)
    {
        delete m_vct[i];
    }
	m_vct.clear();
}

/******************************************************************************
    函 数 名:PushFrame
    参    数:
        参数类型        参数性质    参数名          描述
    返回类型:void
    返 回 值:
    目    的:向缓冲区中加入数据
    说    明:
    记    录:日期时间            作  者    备注
              2006.09.06          王  强    编制程序
******************************************************************************/
void TBuffer::PushFrame(TWQFrame &frame)
{
    ::EnterCriticalSection(&m_cs);
    *(m_vct[m_usWritePos]) = frame;
	m_vct[m_usWritePos]->m_bReadFlag = false;	//置未读标记
	unsigned short usTmp((++m_usWritePos)%m_iSize);
    m_usWritePos = usTmp;
    ::LeaveCriticalSection(&m_cs);
}

/******************************************************************************
    函 数 名:GetFrame
    参    数:
        参数类型        参数性质    参数名          描述
        bool            IN          bRelease        此数据读取过后,是否将
                                                    数据指针移动到下一个可
                                                    读数据处
    返回类型:TWQFrame *
    返 回 值:缓冲区中的数据,如果返回空指针,表示缓冲区为空
    目    的:从缓冲区中取得数据
    说    明:
    记    录:日期时间            作  者    备注
              2006.09.06          王  强    编制程序
******************************************************************************/
TWQFrame *TBuffer::GetFrame(void)
{
	TWQFrame *pFrame(NULL);

	::EnterCriticalSection(&m_cs);
	unsigned short usTmp((m_usReadPos+1)%m_iSize);
	//缓冲区为空时不读取
	if(usTmp!=m_usWritePos)
	{
		m_usReadPos = usTmp;
		pFrame = m_vct[m_usReadPos];
		pFrame->m_bReadFlag = true;
		//数据取走后,判断缓冲区是否为空
	}
	::LeaveCriticalSection(&m_cs);

    return pFrame;
}

/******************************************************************************
    函 数 名:Reset
    参    数:
        参数类型        参数性质    参数名        描述
    返回类型:void
    返 回 值:
    目    的:将缓冲区复位到初始状态
    说    明:
    记    录:日期时间            作  者    备注
              2006/09/07          王  强    编制程序
******************************************************************************/
void TBuffer::Reset(void)
{
	::EnterCriticalSection(&m_cs);
	m_usReadPos=0;
	m_usWritePos=1;
	int iSize(m_vct.size());
	for(int i=0;i<iSize;++i)
	{
		m_vct[i]->m_bReadFlag = false;
	}
	::LeaveCriticalSection(&m_cs);
}

/******************************************************************************
    函 数 名:HaveData
    参    数:
        参数类型        参数性质    参数名        描述
    返回类型:bool
    返 回 值:
	   true :缓冲区不空,有数据
	   false:缓冲区空,无数据
    目    的:判断缓冲区内是否有未读的数据
    说    明:判断当前写位置与读位置是否不同,如果不同,表示缓冲区不空;
    记    录:日期时间            作  者    备注
              2006/09/07          王  强    编制程序
******************************************************************************/
bool TBuffer::HaveData(void)
{
	bool bResult(false);
	::EnterCriticalSection(&m_cs);
	unsigned short usTmp((m_usReadPos+1)%m_iSize);
	bResult = (usTmp!=m_usWritePos);
	::LeaveCriticalSection(&m_cs);
	return bResult;
}

/******************************************************************************
    函 数 名:IsEmpty
    参    数:
        参数类型        参数性质    参数名        描述
    返回类型:bool
    返 回 值:
	   true :缓冲区空,无数据
	   false:缓冲区不空,有数据
    目    的:判断缓冲区是否为空
    说    明:判断当前写位置与读位置是否不同,如果不同,表示缓冲区不空;
    记    录:日期时间            作  者    备注
              2006/09/07          王  强    编制程序
******************************************************************************/
bool TBuffer::IsEmpty(void)
{
	return !HaveData();
}

/******************************************************************************
    函 数 名:PushData
    参    数:
        参数类型        参数性质    参数名          描述
        char *          IN          szBuffer
        unsigned short  IN          usLen
    返回类型:void
    返 回 值:
    目    的:向缓冲区中加入数据
    说    明:
    记    录:日期时间            作  者    备注
              2006.09.06          王  强    编制程序
******************************************************************************/
void TBuffer::PushData(char *szBuffer,unsigned short usLen)
{
    ::EnterCriticalSection(&m_cs);
    TWQFrame *pFrame(m_vct[m_usWritePos]);
    pFrame->SetData(szBuffer,usLen);
	pFrame->m_bReadFlag = false;	//置未读标记
	unsigned short usTmp((++m_usWritePos)%m_iSize);
    m_usWritePos = usTmp;
    ::LeaveCriticalSection(&m_cs);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -