基于QIODevice的环形缓冲

本文介绍了在QT框架下,基于QIODevice设计的QLoopBuffer类,该类作为环形缓冲,适用于多线程环境中的数据读写。QLoopBuffer保证了数据的安全性,遵循先入先出原则,且不支持直接的指针操作。文章提供了类的详细定义和部分源代码,包括QLoopBuffer的特性、成员函数以及其在QT中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  学习QT快5个月了,终于想写一些东西了,希望大家不要见笑,在写基于 ffmpeg的视频处理中,需要一个缓冲存储音频数据以便于QAudio播放。QAudioOutput支持i从QIODevice读取数据。希望能有一个继承于QIODevice能通过另外一个线程不断的写入数据来不断的播放。于是想到了环形缓冲。能在有限的内存里。实现上诉功能。同时还可用于其他通讯程序。在写之前看了一下QIODevice的源码以及QBuffer的源码。初步了解了QT基本程序框架。

QLoopBuffer.h

/********************************************************************/

 

/****************************************************************************
** copy right:lbwave(lbwave@sina.com)
环形缓冲:环形缓冲是在一段连续分配的有限内存空间内,首尾衔接存储数据。环形缓冲有以下几个特点
1、内存分配空间连续,大小固定,便于内存管理。
2、遵循先入先出的原则。及读写的地址指针不受用户控制。而且读写指针分开。
根据上述特点,为了提高环形缓从的数据安全:
1、环形缓冲在使用者看到的是一个存储池。使用者只能向缓冲池注入数据和读出数据。可以获得缓冲池的信息。但不能操作数据。因此在缓冲中随意移动指针是有害的。
2、在环形缓冲中seek函数和pos 是不应该存在的。
3、read函数仅从缓冲头读出数据,并清除出缓冲区。
3、write函数从缓冲尾写入数据。
4、缓冲中重要的数据:usedsize(可读数据大小) buffersize(缓冲池大小)

以下是遵循QT的源代码标准写的环形缓冲类:
1、继承于QIODevice
在QT很多输入输出类都是基于QIODevice的操作。从QIODvice中继承可以方便的用于输入输出操作。
2、支持多线程操作
3、有读写同步操作
4、支持阻塞方式读写


以下环形缓冲类参照了QBuffer.h QBuffer.cpp的写法

QLoopBuffer详解:


****************************************************************************/

#ifndef QLoopBuffer_H
#define QLoopBuffer_H

#include <QtCore/qiodevice.h>
#include <QtCore/qbytearray.h>
#include <QtCore/QMutex>
#include <QtCore/QWaitCondition>
#include "private/qiodevice_p.h"
#include <QDebug>

QT_BEGIN_HEADER

QT_BEGIN_NAMESPACE

QT_MODULE(Core)

class QObject;
class QLoopBufferPrivate;

class QLoopBuffer : public QIODevice
{
#ifndef QT_NO_QOBJECT
  Q_OBJECT
#endif

public:
#ifndef QT_NO_QOBJECT
  explicit QLoopBuffer(QObject *parent = 0);
  QLoopBuffer(QByteArray *buf, QObject *parent = 0);
  QLo

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值