• 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结构体中定义的是要存入队列的数据。此类还不完善,日后有时间完善再上传。请各位大牛们提出宝贵意见。

  • 相关阅读:
    调用控制台程序函数 RunProcess
    url传递中文的解决方案(备忘)
    Microsoft.SharePoint.SPException 安全性验证无效——错误解决
    Windows SharePoint Services 虚拟服务器没被配置为与 ASP.NET 2.0.50727.42 一起使用解决办法
    automation服务器不能创建对象
    InfoPath窗体事件列表说明和示例使用
    ORA01113:文件n需要介质恢复 (转载)
    DevExpress 第三方控件汉化的全部代码和使用方法 (转载)
    爱的感觉(转载)
    关于Oracle 01122,01110,01207的错误和解决(转载)
  • 原文地址:https://www.cnblogs.com/J-July/p/5222522.html
Copyright © 2020-2023  润新知