天天看点

生产者消费者模型(Qt实现)

Qt实现生产者消费者模型

本文展示的是用Qt实现的生产者消费者模型。

该模型含有4个生产者,4个消费者,12个缓冲区。

当缓冲区放满产品时,生产者进程阻塞。

当缓冲区无产品时,消费者进程阻塞。

点击“Producer1”可以改变当前进程的状态。

点击“Pause"可以暂停所有进程,点击”Reset"可以恢复初始状态。

每一个生产者生产的物品有固定的颜色,以示区分。

右侧文本栏展示每一时刻各进程的运行/阻塞情况。

中央文本实时显示空余数量和已有物品数量。

生产者消费者模型(Qt实现)
生产者消费者模型(Qt实现)
生产者消费者模型(Qt实现)

核心代码段:

class Consumer : public QThread			//消费者进程
{
    Q_OBJECT

private:
    int n;	//阻塞/运行状态标志

public:
    void run()	//重写run函数
    {
        while(true)
        {
            if(n == 1 && full.tryAcquire())		//若P操作成功
            {
                empty.release();				//P(empty)
                emit consume();
                emit consumeBlock(false);
                consumerPosition = (consumerPosition + 1) % BufSize;	//修改当前位置
            }
            else
            {
                emit consumeBlock(true);	//否则,阻塞
            }
            Sleep(sleepTime);			//添加时间间隔,增强可视化效果
        }
    }

    void setCondition(int Button)		//设置当前状态
    {
        n=Button;
    }
signals:
    void consume();
    void consumeBlock(bool isBlocked);
};


class Producer : public QThread		//生产者进程
{
    Q_OBJECT

private:
    int n;			//阻塞/运行状态

public:
    void run()
    {
        while (true)
        {
            if(n == 1 && empty.tryAcquire())	//若P操作成功
            {
                full.release();		//V(empty)
                emit produce();
                emit produceBlock(false);
                producerPosition = (producerPosition + 1) % BufSize;	//修改当前位置
            }
            else
            {
                emit produceBlock(true);	//否则,阻塞
            }
            Sleep(sleepTime);	//添加时间间隔,增强可视化效果
        }
    }

    void setCondition(int Button)	//设置当前状态
    {
        n=Button;
    }
signals:
    void produce();
    void produceBlock(bool isBlocked);
};
           

资源下载地址

包括可执行程序和源代码

继续阅读