分享一个在工作中用到的简单的环形缓冲区。构造简单,可以改造到Qt中使用,也可以直接在VS下使用。
所谓环形缓冲区,其实就是带有标识缓冲区中数据头、尾位置的缓冲区,这个缓冲区根据业务的不同,要设置的稍微大一点,不能一有数据过来就填满了,这样就失去使用的意义了。
在实际工作中,我们使用TCP和设备进行通信,如果数据流量过大,可以先把数据接收到数据缓冲区中,处理之后再取出。我们定义的包协议可以采用定长包,可以采用不定长度的包,环形缓冲区都能处理。
//头文件定义
class CircleBuffer
{
public:
CircleBuffer();
~CircleBuffer();
private:
char *buf; //指向环形缓冲区的指针
int head; //缓冲区头部索引
int rear; //缓冲区尾部索引
int maxBuf; //缓冲区的最大值(根据业务不同,设置合适的值)
int packHeadLength; //数据包头长度(如果是定长包,那么这里可以是整个数据包。如果是不
//定长的,那么这里就是包头的长度)
char processBuf[1024]; //缓冲区中的数据就放在这里进行处理,然后通过回调或者信号槽的方
//式传递出去
protected:
inline int getDataLength(); //缓冲区中数据的长度
inline int getFreeBufferLength();