三、核心代码
a) BUF结构体
typedef struct tagSENDBUF
{ long buffertime; //记录数据的时间
LPBYTE sendbuf; //记录数据的起始地址
unsigned long buflength; //记录数据的长度
}SENDBUF,*pSendBuf;
b) 通道单元的成员变量
LPBYTE m_DataBufCache; //缓冲区指针
CArray<SENDBUF,SENDBUF&> m_data_buffer; //动态数组
LPBYTE m_NowBufCache; //内存地址,当前写到哪了
int m_Valid_pos; //有效位置。超过这个位置为无效数据;
int m_BufCount; //数组的个数
int m_read_pos; //记录数组中,该从第几个开始写
c) 填充缓冲区代码
MULTIBUFSIZE是个常量,指申请内存的大小。
if ((m_NowBufCache-m_DataBufCache)+dwBufSize>MULTIBUFSIZE)
{
//////////////////////////////////////
//把m_read_pos置为0
//////////////////////////////////////
}
//如果m_BufCount<m_read_pos+1,则需要动态建一个SENDBUF
//,记录要记录的信息,并加入到数组中
if (m_BufCount<m_read_pos+1)
{
SENDBUF _sendbuf;
//////////////////////////////////////
//记录要记录的信息/
//////////////////////////////////////
m_data_buffer.Add(_sendbuf);
m_BufCount=m_read_pos+1;
}
else
{
/////////////////////////////////////////////
//取出m_data_buffer[m_read_pos],
//然后修改其中的内容
/////////////////////////////////////////////
}
m_read_pos++; //把数组写位置指向下一个位置
四、具体应用
使用缓冲区:
m_Binding_Channel是指绑定的一个数据流通道。
m_write_pos是指读通道数组里的第几个SENDBUF。
//如果超过有效位置,则从第0个开始读
if (m_write_pos>m_Binding_Channel->m_Valid_pos)
{
m_write_pos=0;
}
//检验m_Binding_Channel->m_data_buffer[m_write_pos]里数据的合法性
//比如时间,BUG大小等是否符合要求
然后就可以使用m_Binding_Channel->m_data_buffer[m_write_pos]里面记录的信息了。
锐虎科技 研发部
锐虎科技,专注安防监控平台软件设计