#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->labelResult->setAlignment(Qt::AlignCenter);
ui->labelResult->setText("Empty:12\nFull:0");
producerPosition = 0;
consumerPosition = 0;
p1 = new Producer();
p2 = new Producer();
p3 = new Producer();
p4 = new Producer();
c1 = new Consumer();
c2 = new Consumer();
c3 = new Consumer();
c4 = new Consumer();
graph[0] = ui->Buf1;
graph[1] = ui->Buf2;
graph[2] = ui->Buf3;
graph[3] = ui->Buf4;
graph[4] = ui->Buf5;
graph[5] = ui->Buf6;
graph[6] = ui->Buf7;
graph[7] = ui->Buf8;
graph[8] = ui->Buf9;
graph[9] = ui->Buf10;
graph[10] = ui->Buf11;
graph[11] = ui->Buf12;
connect(p1,SIGNAL(produce()),this,SLOT(produced1()));
connect(p2,SIGNAL(produce()),this,SLOT(produced2()));
connect(p3,SIGNAL(produce()),this,SLOT(produced3()));
connect(p4,SIGNAL(produce()),this,SLOT(produced4()));
connect(p1,SIGNAL(produceBlock(bool)),this,SLOT(produceBlocked1(bool)));
connect(p2,SIGNAL(produceBlock(bool)),this,SLOT(produceBlocked2(bool)));
connect(p3,SIGNAL(produceBlock(bool)),this,SLOT(produceBlocked3(bool)));
connect(p4,SIGNAL(produceBlock(bool)),this,SLOT(produceBlocked4(bool)));
connect(c1,SIGNAL(consume()),this,SLOT(consumed1()));
connect(c2,SIGNAL(consume()),this,SLOT(consumed2()));
connect(c3,SIGNAL(consume()),this,SLOT(consumed3()));
connect(c4,SIGNAL(consume()),this,SLOT(consumed4()));
connect(c1,SIGNAL(consumeBlock(bool)),this,SLOT(consumeBlocked1(bool)));
connect(c2,SIGNAL(consumeBlock(bool)),this,SLOT(consumeBlocked2(bool)));
connect(c3,SIGNAL(consumeBlock(bool)),this,SLOT(consumeBlocked3(bool)));
connect(c4,SIGNAL(consumeBlock(bool)),this,SLOT(consumeBlocked4(bool)));
}
MainWindow::~MainWindow()
{
delete ui;
}
int producerPosition = 0;
int consumerPosition = 0;
QSemaphore empty(12); // 12个空间
QSemaphore full(0);
static int p1Button = -1;
static int p2Button = -1;
static int p3Button = -1;
static int p4Button = -1;
static int c1Button = -1;
static int c2Button = -1;
static int c3Button = -1;
static int c4Button = -1;
void MainWindow::on_Producer1_clicked()
{
p1Button *= -1;
p1->setCondition(p1Button);
p1->start();
}
void MainWindow::on_Producer2_clicked()
{
p2Button *= -1;
p2->setCondition(p2Button);
p2->start();
}
void MainWindow::on_Producer3_clicked()
{
p3Button *= -1;
p3->setCondition(p3Button);
p3->start();
}
void MainWindow::on_Producer4_clicked()
{
p4Button *= -1;
p4->setCondition(p4Button);
p4->start();
}
// 生产信息可视化
void MainWindow::produced1()
{
QString str = "Producer1 produced\n";
QString str2 = QObject::tr("Empty:%1\nFull:%2").arg(empty.available()).arg(full.available());
ui->textResult->insertPlainText(str);
ui->textResult->moveCursor(QTextCursor::End);
ui->labelResult->clear();
ui->labelResult->setText(str2);
graph[producerPosition]->setStyleSheet("background-color: rgb(255, 0, 0)");
}
void MainWindow::produced2()
{
QString str="Producer2 produced\n";
QString str2=QObject::tr("Empty:%1\nFull:%2").arg(empty.available()).arg(full.available());
ui->textResult->insertPlainText(str);
ui->textResult->moveCursor(QTextCursor::End);
ui->labelResult->clear();
ui->labelResult->setText(str2);
graph[producerPosition]->setStyleSheet("background-color: rgb(255, 255, 0)");
}
void MainWindow::produced3()
{
QString str="Producer3 produced\n";
QString str2=QObject::tr("Empty:%1\nFull:%2").arg(empty.available()).arg(full.available());
ui->textResult->insertPlainText(str);
ui->textResult->moveCursor(QTextCursor::End);
ui->labelResult->clear();
ui->labelResult->setText(str2);
graph[producerPosition]->setStyleSheet("background-color: rgb(0, 255, 0)");
}
void MainWindow::produced4()
{
QString str="Producer4 produced\n";
QString str2=QObject::tr("Empty:%1\nFull:%2").arg(empty.available()).arg(full.available());
ui->textResult->insertPlainText(str);
ui->textResult->moveCursor(QTextCursor::End);
ui->labelResult->clear();
ui->labelResult->setText(str2);
graph[producerPosition]->setStyleSheet("background-color: rgb(65, 105, 225)");
}
// 消费者按钮事件
void MainWindow::on_Consumer1_clicked()
{
c1Button *= -1;
c1->setCondition(c1Button);
c1->start();
}
void MainWindow::on_Consumer2_clicked()
{
c2Button *= -1;
c2->setCondition(c2Button);
c2->start();
}
void MainWindow::on_Consumer3_clicked()
{
c3Button *= -1;
c3->setCondition(c3Button);
c3->start();
}
void MainWindow::on_Consumer4_clicked()
{
c4Button *= -1;
c4->setCondition(c4Button);
c4->start();
}
// 消费事件可视化
void MainWindow::consumed1()
{
QString str="Consumer1 consumed\n";
QString str2=QObject::tr("Empty:%1\nFull:%2").arg(empty.available()).arg(full.available());
ui->textResult->insertPlainText(str);
ui->textResult->moveCursor(QTextCursor::End);
ui->labelResult->clear();
ui->labelResult->setText(str2);
graph[consumerPosition]->setStyleSheet("background-color: rgb(255, 255, 255)");
}
void MainWindow::consumed2()
{
QString str="Consumer2 consumed\n";
QString str2=QObject::tr("Empty:%1\nFull:%2").arg(empty.available()).arg(full.available());
ui->textResult->insertPlainText(str);
ui->textResult->moveCursor(QTextCursor::End);
ui->labelResult->clear();
ui->labelResult->setText(str2);
graph[consumerPosition]->setStyleSheet("background-color: rgb(255, 255, 255)");
}
void MainWindow::consumed3()
{
QString str="Consumer3 consumed\n";
QString str2=QObject::tr("Empty:%1\nFull:%2").arg(empty.available()).arg(full.available());
ui->textResult->insertPlainText(str);
ui->textResult->moveCursor(QTextCursor::End);
ui->labelResult->clear();
ui->labelResult->setText(str2);
graph[consumerPosition]->setStyleSheet("background-color: rgb(255, 255, 255)");
}
void MainWindow::consumed4()
{
QString str="Consumer4 consumed\n";
QString str2=QObject::tr("Empty:%1\nFull:%2").arg(empty.available()).arg(full.available());
ui->textResult->insertPlainText(str);
ui->textResult->moveCursor(QTextCursor::End);
ui->labelResult->clear();
ui->labelResult->setText(str2);
graph[consumerPosition]->setStyleSheet("background-color: rgb(255, 255, 255)");
}
// producer是否等待的可视化
void MainWindow::produceBlocked1(bool isBlocked)
{
if(isBlocked)
{
ui->Producer1->setStyleSheet("background-color: rgb(255, 0, 0)");
QString str="Producer1 suspended\n";
ui->textResult->insertPlainText(str);
ui->textResult->moveCursor(QTextCursor::End);
}
else {
ui->Producer1->setStyleSheet("background-color: rgb(0, 255, 0)");
}
}
void MainWindow::produceBlocked2(bool isBlocked)
{
if(isBlocked)
{
ui->Producer2->setStyleSheet("background-color: rgb(255, 0, 0)");
}
else {
ui->Producer2->setStyleSheet("background-color: rgb(0, 255, 0)");
}
}
void MainWindow::produceBlocked3(bool isBlocked)
{
if(isBlocked)
{
ui->Producer3->setStyleSheet("background-color: rgb(255, 0, 0)");
}
else {
ui->Producer3->setStyleSheet("background-color: rgb(0, 255, 0)");
}
}
void MainWindow::produceBlocked4(bool isBlocked)
{
if(isBlocked)
{
ui->Producer4->setStyleSheet("background-color: rgb(255, 0, 0)");
}
else {
ui->Producer4->setStyleSheet("background-color: rgb(0, 255, 0)");
}
}
// 判断消�
操作系统实验:进程同步和死锁作业:编程模拟生产者/消费者问题(有界面 QT 可视化)
需积分: 34 151 浏览量
2022-07-14
12:38:25
上传
评论 3
收藏 8KB ZIP 举报
EuphoriaTime
- 粉丝: 0
- 资源: 7
最新资源
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
- 林周瑜-论文.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0