Qt实现生产者消费者模型
本文展示的是用Qt实现的生产者消费者模型。
该模型含有4个生产者,4个消费者,12个缓冲区。
当缓冲区放满产品时,生产者进程阻塞。
当缓冲区无产品时,消费者进程阻塞。
点击“Producer1”可以改变当前进程的状态。
点击“Pause"可以暂停所有进程,点击”Reset"可以恢复初始状态。
每一个生产者生产的物品有固定的颜色,以示区分。
右侧文本栏展示每一时刻各进程的运行/阻塞情况。
中央文本实时显示空余数量和已有物品数量。
核心代码段:
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);
};
资源下载地址
包括可执行程序和源代码