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);
};
資源下載下傳位址
包括可執行程式和源代碼