zoukankan      html  css  js  c++  java
  • C++ 循环队列实现缓冲类

         好久没有写博客了,前段时间做项目需要一个缓冲机制用来缓存视频帧。下面是自己实现的视频缓冲类。在此类中用循环队列实现了视频帧数据的入队、出队。在类中使用互斥对象避免出入队出现错误。下面是代码。

     /*****************头文件****************/

    using namespace std;
    
    #define  MAXSIZE  50
    
    typedef struct
    {
    	int iSize;//数据的大小
    	char *cdata;	
    }bufData;
    typedef struct 
    {
    	bufData mdata[MAXSIZE];
    	int iRead;//队头
    	int iWrite;//队尾
    }bufferPara;
    
    class CycleBuffer
    {
    public:
    	CycleBuffer(void);
    	~CycleBuffer(void);
    	
    	BOOL push(bufferPara *Q,char* src,int strLen);//缓冲区存入
    
    	char* pop(bufferPara *Q,long &dsLen);//弹出数据
    
    	BOOL InitQueue(bufferPara *Q);//初始化队列
    	bufferPara  mbufferPara;
    	char *dest;
    private:
    	
    	HANDLE mutexHandle;
    	char *item;
    
    };


    /**************************实现*******************/

    #include "StdAfx.h" #include "CycleBuffer.h" CycleBuffer::CycleBuffer(void) { InitQueue(&mbufferPara); dest = new char[1024*500]; memset(dest,0,1024*500); mutexHandle = CreateMutex(NULL,FALSE,NULL ); } CycleBuffer::~CycleBuffer(void) { CloseHandle(mutexHandle); for (int i=0;i<MAXSIZE;i++) { delete[] mbufferPara.mdata[i].cdata; } } BOOL CycleBuffer::push(bufferPara *Q,char* src,int srcLen) { WaitForSingleObject(mutexHandle,INFINITE); if ((Q->iWrite+1)%MAXSIZE!=Q->iRead) { memcpy(Q->mdata[Q->iWrite].cdata,src,srcLen); //Q->mdata[Q->iWrite].cdata = src; Q->mdata[Q->iWrite].iSize = srcLen; Q->iWrite = (Q->iWrite+1)%MAXSIZE; ReleaseMutex(mutexHandle); return TRUE; } else { ReleaseMutex(mutexHandle); return FALSE; } } char* CycleBuffer::pop(bufferPara *Q,long &dstLen) { WaitForSingleObject(mutexHandle,INFINITE); if (Q->iRead!=Q->iWrite) { dest = Q->mdata[Q->iRead].cdata; dstLen = Q->mdata[Q->iRead].iSize; memcpy(dest,Q->mdata[Q->iRead].cdata,dstLen); Q->iRead = (Q->iRead+1)%MAXSIZE; ReleaseMutex(mutexHandle); return dest; } else { ReleaseMutex(mutexHandle); return NULL; } } BOOL CycleBuffer::InitQueue(bufferPara * Q) { Q->iRead =0; Q->iWrite=0; for (int i=0;i<MAXSIZE;i++) { Q->mdata[i].cdata = new char[1024*500]; memset(Q->mdata[i].cdata,0,1024*500); Q->mdata[i].iSize = 0; } return TRUE; }

      

          注意头文件中的两个结构体,结构体bufferPara定义的是基本的队列的结构,bufferData结构体中定义的是要存入队列的数据。此类还不完善,日后有时间完善再上传。请各位大牛们提出宝贵意见。

  • 相关阅读:
    HDU 2955 Robberies
    CodeForces 429B Working out DP
    Lweb and String 超级大水题
    A water problem 大数取余。
    Danganronpa 水题。
    HDU 2018 DP
    Git分支管理
    linux相关操作命令
    项目部署相关命令(pm2)
    ubantu16.04安装sougou输入法
  • 原文地址:https://www.cnblogs.com/J-July/p/5222522.html
Copyright © 2011-2022 走看看