利用QBuffer和QLinkedList做数据块存储队列
Qt中QByteArray存储数据很方便,使用QBuffer存储大块数据更方便。QBuffer类包装了QByteArray类对象,实际存储还是使用了QByteArray,但QBuffer实现了QIODevice接口,其拥有丰富的读写接口,使操作更方便。
主要需求是,存进去的数据接口函数参数要求是char* dat 和int datalength是形式,取出来的数据接口函数参数也是一样。
qt里对基本数据格式都进行了封装,提供了如QChar、QBitArray、QByteArray类,使用起来也是很方便。如网络上接受到数据,都是帧流,处理数据时,需要按字节处理(因为通信协议多按字节定义),如上的缓存接口定义就比较合适。
使用QBuffer+QLinkedList做一个缓存队列就非常容易了。
下面给出代码:
FrameStreamManager.cpp
- #include "FrameStreamManager.h"
- FrameStreamManager::FrameStreamManager()
- {
- }
- FrameStreamManager::~FrameStreamManager()
- {
- }
- int FrameStreamManager::putFrame(char *in,int length)
- {
- int ret;
- QMutexLocker locker(&mutex);
- QBuffer *qbuf = new QBuffer();
- qbuf->open(QBuffer::ReadWrite);
- ret = qbuf->write(in,length);
- qbuf->close();
- list.append(qbuf);
- return ret;
- }
- int FrameStreamManager::getFrame(char *retbuf,int size)
- {
- QMutexLocker locker(&mutex);
- QBuffer *qbuf;
- int ret=;
- if(list.size() > )
- {
- qbuf = list.takeFirst();
- qbuf->open(QBuffer::ReadWrite);
- ret = qbuf->read(retbuf,size);
- qbuf->close();
- delete qbuf;
- }
- return ret;
- }
- int FrameStreamManager::getFrameSize()
- {
- return list.size();
- }
FrameStreamManager.h
- #ifndef FRAMESTREAMMANAGER_H
- #define FRAMESTREAMMANAGER_H
- #include <QLinkedList>
- #include <QBuffer>
- #include <QByteArray>
- #include <QMutexLocker>
- #include <QMutex>
- class FrameStreamManager
- {
- public:
- FrameStreamManager();
- ~FrameStreamManager();
- private:
- QLinkedList<QBuffer*> list;
- QMutex mutex;
- public:
- int putFrame(char *in,int length);
- int getFrame(char *rebuf,int size);
- int getFrameSize(void);
- };
- #endif
测试文件:
mainwindow.cpp
- #include "mainwindow.h"
- #include <QLabel>
- #include <QtDebug>
- #include <QBuffer>
- #include <QPushButton>
- MainWindow::MainWindow(QWidget *parent)
- : QMainWindow(parent)
- {
- this->setFixedSize(,);
- QLabel *label = new QLabel("hello you are",this);
- label->move(,);
- QPushButton *btn1 = new QPushButton("put",this);
- connect(btn1, SIGNAL(clicked()), this, SLOT(btn1Clicked()));
- btn1->move(,);
- QPushButton *btn2 = new QPushButton("show",this);
- connect(btn2,SIGNAL(clicked()),this,SLOT(btn2Clicked()));
- btn2->move(,);
- QPushButton *btn3 = new QPushButton("get",this);
- connect(btn3,SIGNAL(clicked()),this,SLOT(btn3Clicked()));
- btn3->move(,);
- for(int i=;i<;i++)
- defaultbuf[i] = ;
- memset(retbuf,,);
- /*// int BUFSIZE = 2048;
- // QBuffer qbuf;
- // qbuf.open(QBuffer::ReadWrite);
- // char *buf = (char*)malloc(BUFSIZE);
- // for(int i=0;i<BUFSIZE;i++)
- // {
- // buf[i] = 234;
- // }
- // int ret = qbuf.write(buf,BUFSIZE);
- // qbuf.close();
- // qDebug()<<"ret = "<<ret;
- // char *retbuf = (char *)malloc(BUFSIZE);
- // memset(retbuf,0,BUFSIZE);
- // qbuf.open(QBuffer::ReadWrite);
- // ret = qbuf.read(retbuf,BUFSIZE);
- // qDebug()<<"ret = "<<ret;
- // for(int i=0;i<BUFSIZE;i++)
- // {
- // if(retbuf[i] != (char)234)
- // {
- // qDebug()<<"Error at "<<i<<" : "<<retbuf[i];
- // }
- // }
- // qbuf.close();
- // free(buf);
- // free(retbuf); */
- }
- MainWindow::~MainWindow()
- {
- }
- void MainWindow::btn1Clicked()
- {
- qDebug()<<"\nput frame!";
- int len = fsm.putFrame(defaultbuf,);
- if(len != )
- qDebug()<<"put frame buf";
- }
- void MainWindow::btn2Clicked()
- {
- qDebug()<<"\nshow frame list size!";
- int len = fsm.getFrameSize();
- qDebug()<<"Now Frame Size = "<<len;
- }
- void MainWindow::btn3Clicked()
- {
- qDebug()<<"\nget frame and check!";
- int len = fsm.getFrame(retbuf,);
- if(len != )
- qDebug()<<"get frame returns "<<len;
- else
- {
- for(int i=;i<;i++)
- {
- if(retbuf[i] != )
- qDebug()<<" get data error at "<<i<<" : "<<retbuf[i];
- }
- }
- memset(retbuf,,);
- }
mainwindow.h
- #ifndef MAINWINDOW_H
- #define MAINWINDOW_H
- #include <QMainWindow>
- #include "FrameStreamManager.h"
- class MainWindow : public QMainWindow
- {
- Q_OBJECT
- public:
- MainWindow(QWidget *parent = );
- ~MainWindow();
- private slots:
- void btn1Clicked();
- void btn2Clicked();
- void btn3Clicked();
- private:
- FrameStreamManager fsm;
- char defaultbuf[];
- char retbuf[];
- };
- #endif // MAINWINDOW_H
QByteArray也是可以完成同样功能,QByteArray有如下函数,QByteArray & QByteArray::append(const char *str,int len) 和char * QByteArray::data()。就是QByteArray会在返回的char* 数据后自动加‘\0’,但int QByteArray::size()返回来的数是不含'\0',利用size()函数和data()封装一下就可以达到上面QBuffer达到的效果。
而且使用QByteArray有个好处,QByteArray重载了操作符=,所以FrameStreamManager里的list可以这样定义-->QLinkedList<QByteArray> list。从队列中取数据时可以直接写QByteArray tmp = list.takeFirst();而QBuffer没有重载=操作符,QBuffer tmp = list.takeFirst();这样就写就会直接报错。定义队列时就必须改成上面那样,就需要自己管理内存了。同时,使用QBuffer还需要打开和关闭设备。
综上,队列中使用QByteArray做存储,封装使用更方便。
利用QBuffer和QLinkedList做数据块存储队列的更多相关文章
- HDFS中数据节点数据块存储示例
数据块在数据节点上是按照如下方式存储的. 首先是一个存储的根目录/Hadoop/data/dfs/dn,如下图所示: 接着进入current目录,如下图所示: 再进入后续的BP-433072574-1 ...
- [转]Oracle数据块体系的详细介绍
数据块概述Oracle对数据库数据文件(datafile)中的存储空间进行管理的单位是数据块(data block).数据块是数据库中最小的(逻辑)数据单位.与数据块对应的,所有数据在操作系统级的最小 ...
- Ext2文件系统布局,文件数据块寻址,VFS虚拟文件系统
注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...
- Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统
前言 我们知道HDFS集群中,所有的文件都是存放在DN的数据块中的.那我们该怎么去查看数据块的相关属性的呢?这就是我今天分享的内容了 一.HDFS中数据块概述 1.1.HDFS集群中数据块存放位置 我 ...
- HDFS源码分析数据块校验之DataBlockScanner
DataBlockScanner是运行在数据节点DataNode上的一个后台线程.它为所有的块池管理块扫描.针对每个块池,一个BlockPoolSliceScanner对象将会被创建,其运行在一个单独 ...
- mongodb 数据块的迁移流程介绍
1. 基本概念 1.1 Chunk(数据块) 表示特定服务器上面,连续范围的分片键值所包含的一组数据,是一个逻辑概念. 例如,某数据块记录如下: { "_id" : "c ...
- vuex数据持久化存储
想想好还是说下vuex数据的持久化存储吧.依稀还记得在做第一个vue项目时,由于刚刚使用vue,对vue的一些基本概念只是有一个简单的了解.当涉及到非父子组件之间通信时,选择了vuex.只是后来竟然发 ...
- 利用php的序列化和反序列化来做简单的数据本地存储
利用php的序列化和反序列化来做简单的数据本地存储 如下程序可以做为一个工具类 /** * 利用php的序列化和反序列化来做简单的数据本地存储 */ class objectdb { private ...
- 【oracle11g,17】存储结构: 段的类型,数据块(行连接、行迁移,块头),段的管理方式,高水位线
一.段的类型: 1.什么是段:段是存储单元. 1.段的类型有: 表 分区表 簇表 索引 索引组织表(IOT表) 分区索引 暂时段 undo段 lob段(blob ,clob) 内嵌表(record类型 ...
随机推荐
- Codeforces Round #360 (Div. 2)——C. NP-Hard Problem(BFS染色判二分图)
C. NP-Hard Problem time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 常州模拟赛d3t3 两只怪物心心相印
题目背景 从前我是一位无名的旅人,旅途中我得到了某样东西:贤者之石.我因此得到悠久的时光和漂泊的生命.1897年冬天,我一时兴起舍弃了旅人的生活. 贤者之石创造出来的,是货真价实的黄金.我的名声传遍了 ...
- 【2018.10.4】CXM笔记(图论)
.1.给你一个无向图,问这张图的最小割是否唯一.输出yes或no. 跑一边最大流,那么最小割的那些正向边一定满流(也就是过不了了).所以在残余网络上,从S到T和从T到S各广搜找一组最小割的边(即正向边 ...
- Spoj-DRUIDEOI Fata7y Ya Warda!
Fata7y Ya Warda! Druid (AKA Amr Alaa El-Deen) and little EOIers have finished their training and the ...
- Nk 1214 Relatives(欧拉函数)
Time Limit: 1500 ms Memory Limit: 10000 kB Total Submit : 234 (77 users) Accepted Submit : 10 ...
- Count on a tree(bzoj 2588)
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
- 「CodePlus 2018 3 月赛」白金元首与莫斯科
$n \leq 17,m \leq 17$,$n*m$的01矩形,对每一个0问:当他单独变成1之后,在其他0处放多米诺牌(不一定放满,可以不放)的方案数.膜$1e9+7$. 直接$dp$是$n^42^ ...
- Python入门---易错已错易混淆----知识点
1.not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9 结果会输出啥? 根据优先级:(not 1) or (0 and 1) or (3 a ...
- R语言入门视频笔记--8--数据框
一.数据框 使用data.frame函数生成数据框 x <- c(20122014101:20122014128) y <- rnorm(28,85,18) #生成28个平均数为85,方差 ...
- 存code
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> us ...