Qt 生产者消费者模型

基于QT实现的生产者消费者模型
不足之处请留言指出

//global.h
#ifndef GLOBAL_H
#define GLOBAL_H
 
#include <QMutex>
#include <QWaitCondition>
#include <QIODevice>
 
extern QMutex         g_mutex;
extern QWaitCondition g_bufferFull;
extern QWaitCondition g_bufferEmpty;
 

#endif// GLOBAL_H

//global.cpp

#include <QtCore>
#include "global.h"
 
QMutex         g_mutex;
QWaitCondition g_bufferFull;
QWaitCondition g_bufferEmpty;
 
 


//Resource.h
#ifndef RESOURCE_H
#define RESOURCE_H
 
#include <QObject>
 
class Resource : public QObject
{
    Q_OBJECT
public:
    explicit Resource(QObject *pParent = NULL);
 
    void push(QByteArray byte);
 
    void popup();
 
signals:
    void dataChanged(const QByteArray&);
 
public slots:
 
private:
    int  m_index;
    bool m_flag;
};
 
#endif // RESOURCE_H
 
//Resource.cpp
#include <QtCore>
#include "global.h"
#include "Resource.h"
 
Resource::Resource(QObject *pParent)
    : QObject(pParent),
      m_index(0),
      m_flag(false)
{
}
 
void Resource::push(QByteArray byte)
{
    QMutexLocker locker(&g_mutex);
    while (m_flag == true)
    {
        g_bufferFull.wait(&g_mutex);
    }
    qDebug()<<"Producer:"<<++m_index;
    m_flag = true;
    g_bufferEmpty.wakeAll();
}
 
void Resource::popup()
{
    QMutexLocker locker(&g_mutex);
    while (m_flag == false)
    {
        g_bufferEmpty.wait(&g_mutex);
    }
    qDebug()<<"   Consumer:"<<m_index;
    m_flag = false;
    g_bufferFull.wakeAll();
}
 
 
 

//Producer.h
#ifndef PRODUCER_H
#define PRODUCER_H
 
#include <QThread>
#include "Resource.h"
 
class Producer : public QThread
{
    Q_OBJECT
public:
    explicit Producer(Resource &res, QObject *parent = 0);
 
protected:
    void run();
 
signals:
 
public slots:
 
private:
    Resource &m_res;
};
 
#endif // PRODUCER_H
 

//Producer.cpp
#include <QtCore>
#include "global.h"
#include "Producer.h"
 
Producer::Producer(Resource &res, QObject *parent)
    : QThread(parent),
    m_res(res)
{
}
 
void Producer::run()
{
//    while (true)
    for (int i=0; i<30; ++i)
    {
        /****************** 测试数据 ******************/
        QByteArray byte;
        QDataStream out(&byte, QIODevice::WriteOnly);
        QString time = QTime::currentTime().toString("hh:mm:ss");
        out<<time;
        /****************** 测试数据 ******************/
 
        m_res.push(byte);
        usleep(500);
    }
}
 

//Consumer.h
#ifndef CONSUMER_H
#define CONSUMER_H
 
#include <QThread>
#include "Resource.h"
 
class Consumer : public QThread
{
    Q_OBJECT
public:
    explicit Consumer(Resource &res, QObject *parent = 0);
protected:
    void run();
 
signals:
 
public slots:
 
private:
    Resource &m_res;
 
};
 
#endif // CONSUMER_H
 

//Consumer.cpp
#include <QtCore>
#include "Consumer.h"
 
Consumer::Consumer(Resource& res, QObject *parent)
    : QThread(parent),
      m_res(res)
{
}
 
void Consumer::run()
{
    while (true)
    {
        m_res.popup();
    }
}
 
//main.cpp
#include <QtCore>
#include "Resource.h"
#include "Producer.h"
#include "Consumer.h"
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    Resource res;
 
    //1
    Producer p1(res);
    p1.setObjectName("t1");
    p1.start();
 
    Consumer c1(res);
    c1.setObjectName("c1");
    c1.start();
 
 
    //2
    Producer p2(res);
    p2.setObjectName("t2");
    p2.start();
 
    Consumer c2(res);
    c2.setObjectName("c2");
    c2.start();
 
 
    //3
    Producer p3(res);
    p3.setObjectName("t3");
    p3.start();
 
    Consumer c3(res);
    c3.setObjectName("c3");
    c3.start();
 
    return a.exec();
}
 


                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞天遇见妞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值