首先认识一个类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(); //已用信号量加一
}