Qt实现环形缓冲区

喜夏-厌秋 提交于 2019-12-18 09:51:59

首先认识一个类QSemaphore 

     QSemaphore  他提供了一个通用的计数信号量,信号量是互斥量的泛化。虽然互斥锁只能被锁定一次,但是可以获得一个信号量多次。信号量通常用于保护一定数量的相同资源。信号量支持两个基本操作,acquire()和release():

acquire(n) 获取n个资源。如果没有那么多可用资源,调用将阻塞;

release(n)释放n个资源。

实现方式:

 

#include "widget.h"
#include "ui_widget.h"
#include <QSemaphore>
#include <QQueue>
QSemaphore freeBytes(100); //初始化缓冲区大小  缓冲器的未用量
QSemaphore usedBytes(0);   //缓冲区的已用量
QQueue<QString> timeQueue;  //缓冲区
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(Write()));
    timer->start(1000);
    star();
}

Widget::~Widget()
{
    delete ui;
}
void Widget::star()
{
    //创建多线程
     QtConcurrent::run(this,&Widget::m_threadSlot);
}

void Widget::m_threadSlot()
{
    while(true)
    {
    usedBytes.acquire();//已用信号量减一
    qDebug()<<timeQueue.dequeue()<<endl;
    freeBytes.release();  //未用信号量加一
    }
}
void Widget::Write()
{

    freeBytes.acquire();// 未用信号量减一
    timeQueue.enqueue(QTime::currentTime().toString());
    usedBytes.release(); //已用信号量加一

}

 

 

     

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!