天天看點

生産者消費者模型(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);
};
           

資源下載下傳位址

包括可執行程式和源代碼

繼續閱讀