#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
#define MAXPROCESS 50
#define MAXRESOURCE 100
int available[MAXRESOURCE]; // 可利用资源向量:每类资源可利用数量,随着进程的分配和回收改变
int max[MAXPROCESS][MAXRESOURCE]; // 最大需求矩阵:每个进程对每个资源的最大需求量
int allocation[MAXPROCESS][MAXRESOURCE]; // 分配矩阵:每个进程已分配的各个资源数量
int need[MAXPROCESS][MAXRESOURCE]; // 需求矩阵:每个进程尚需的资源需求量 need = max - allocation
int security[MAXPROCESS]; // 进程执行序列
int work[MAXRESOURCE]; // 工作向量:初值available
int finish[MAXRESOURCE]; // 系统是否有足够资源分配给进程:初值false
int pindex;
int index; // 申请资源的进程索引
int request[MAXRESOURCE]; // 申请资源数组
int flag; // 申请资源是否合理的flag
int process_num, source_num; // process_num个进程,source_num个资源
QString name[26] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
// 产生信息表按钮事件
void MainWindow::on_pushButton_clicked()
{
int i, j;
QTableWidgetItem* item;
QString txt;
process_num = ui->lineEdit->text().toInt();
source_num = ui->lineEdit_2->text().toInt();
ui->tableWidget->setRowCount(process_num); // 设置行数
ui->tableWidget->setColumnCount(source_num); // 设置列数
ui->tableWidget_2->setRowCount(process_num);
ui->tableWidget_2->setColumnCount(source_num);
ui->tableWidget_3->setRowCount(1);
ui->tableWidget_3->setColumnCount(source_num);
ui->tableWidget_3->setVerticalHeaderItem(0, new QTableWidgetItem("P"));
ui->tableWidget_4->setColumnCount(source_num);
ui->tableWidget_5->setRowCount(1);
ui->tableWidget_5->setColumnCount(source_num);
ui->tableWidget_5->setVerticalHeaderItem(0, new QTableWidgetItem("P"));
for (i = 0; i < source_num; i++) //改变单元格宽度
{
ui->tableWidget->setColumnWidth(i, 50);
ui->tableWidget_2->setColumnWidth(i, 50);
ui->tableWidget_3->setColumnWidth(i, 50);
ui->tableWidget_4->setColumnWidth(i, 50);
ui->tableWidget_5->setColumnWidth(i, 50);
}
for (i = 0; i < process_num; i++) //设置标题
{
item = new QTableWidgetItem;
txt = "P" + QString::number(i + 1, 10);
item->setText(txt);
QStringList header;
for(int i=0;i<source_num;i++)
header << name[i];
ui->tableWidget->setHorizontalHeaderLabels(header);
ui->tableWidget_2->setHorizontalHeaderLabels(header);
ui->tableWidget_3->setHorizontalHeaderLabels(header);
ui->tableWidget_4->setHorizontalHeaderLabels(header);
ui->tableWidget_5->setHorizontalHeaderLabels(header);
ui->tableWidget->setVerticalHeaderItem(i, item);
ui->tableWidget_2->setVerticalHeaderItem(i, item);
ui->tableWidget_4->setVerticalHeaderItem(i, item);
}
for (i = 0; i < process_num; i++) // 每次重新输入清零
for (j = 0; j < source_num; j++)
{
ui->tableWidget->setItem(i, j, new QTableWidgetItem(""));
ui->tableWidget_2->setItem(i, j, new QTableWidgetItem(""));
ui->tableWidget_4->setItem(i, j, new QTableWidgetItem(""));
}
for (i = 0; i < source_num; i++){ // 每次重新输入清零
ui->tableWidget_3->setItem(0, i, new QTableWidgetItem(""));
ui->tableWidget_5->setItem(0, i, new QTableWidgetItem(""));
}
ui->textBrowser->setPlainText("");
ui->comboBox->clear();
for(i = 0; i < process_num; i++) // 设置comboBox的下拉选项
ui->comboBox->addItem("P" + QString::number(i+1, 10));
}
void MainWindow::clear()
{
for (int l = 0; l < process_num; l++)
{
security[l] = 0;
}
}
void MainWindow::safe()
{
int i, j, k=0, m, apply;
for(j=0;j<source_num;j++)
work[j] = available[j];
for(i=0;i<process_num;i++)
finish[i] = false;
for(i=0;i<process_num;i++){
apply = 0;
for(j=0;j<source_num;j++){
if(finish[i] == false && need[i][j] <= work[j]){
apply++;
if(apply == source_num){
for(m=0;m<source_num;m++){
work[m] = work[m] + allocation[i][m];
}
finish[i] = true;
security[k++] = i;
if(i == (process_num - 1))
i = - 1;
}
}
}
}
for(pindex = 0; pindex < process_num; pindex++){
if(finish[pindex] == false)
break;
}
if(pindex == process_num){
for (j = 0; j < source_num; j++)
{
//必须先设置item,然后再获取,因为默认是空的
QTableWidgetItem *item0 = new QTableWidgetItem(QString::number(available[j]));
ui->tableWidget_3->setItem(0, j, item0);
}
ui->textBrowser->append(" 系统处于安全状态! ");
ui->textBrowser->append(" 建议安全执行序列为: ");
for (j = 0; j < process_num; j++)
{
ui->textBrowser->insertPlainText("P ");
ui->textBrowser->insertPlainText(QString::number(security[j] + 1));
if (j < (process_num - 1))
ui->textBrowser->insertPlainText(" ==> ");
}
}
else
ui->textBrowser->append(" 系统当前处于不安全状态! ");
clear();
}
// 尝试将资源分配给第i个进程
int test(int i)
{
for(int j = 0; j < source_num; j++){
available[j] = available[j] - request[j];
allocation[i][j] = allocation[i][j] + request[j];
need[i][j] = need[i][j] - request[j];
}
return true;
}
int retest(int i)
{
for(int j = 0; j < source_num; j++){
available[j] = available[j] + request[j];
allocation[i][j] = allocation[i][j] - request[j];
need[i][j] = need[i][j] + request[j];
}
return true;
}
void MainWindow::bank(){
int i, j;
flag = true;
index = ui->comboBox->currentIndex();
for(j = 0; j < source_num; j++)
request[j] = ui->tableWidget_5->item(0, j)->text().toInt();
for(j = 0; j < source_num; j++){
if(request[j] > need[index][j]){
flag = false;
ui->textBrowser->insertPlainText("\n");
ui->textBrowser->insertPlainText("进程申请的资源大于它所需要的资源!");
ui->textBrowser->insertPlainText("分配不合理,请重新分配!");
break;
}
else{
if(request[j] > available[j]){
flag = false;
ui->textBrowser->insertPlainText("\n");
ui->textBrowser->insertPlainText("进程申请的资源大于现在可利用的资源!");
ui->textBrowser->insertPlainText("分配不合理,请重新分配");
break;
}
}
}
if(flag){
test(index);
safe();
if(pindex != process_num)
retest(index);
for(j = 0; j < source_num; j++){
QTableWidgetItem *item0 = new QTableWidgetItem(QString::number(allocation[index][j]));
ui->tableWidget_2->setItem(index, j, item0);
}
for(i = 0; i < process_num; i++){
for(j = 0; j < source_num; j++){
QTableWidgetItem *item0 = new QTableWidgetItem(QString::number(need[index][j]));
ui->tableWidget_4->setItem(index, j, item0);
}
}
}
}
// 输入判断+安全性判断
void MainWindow::on_pushButton_2_clicked()
{
int i = 0, j = 0;
bool flag1 = 0, flag2 = 0, flag3 = 0;
int temp[source_num];
for(i = 0; i <source_nu
EuphoriaTime
- 粉丝: 4
- 资源: 7
最新资源
- 电脑公司财务管理系统 SSM毕业设计 源码+数据库+论文(JAVA+SpringBoot+Vue.JS).zip
- 操作系统课程设计:基于Proc文件系统的进程树打印与内核信息访问
- 操作系统课程设计:Linux内核添加系统调用实验
- 几何平均谱分割经验小波变在轴承故障诊断中的应用 程序运行环境为MATLAB r2021b, 经验小波变(EWT)使用自适应小波细分方案从而创建信号的多分辨率分析 (MRA),我在科研中用的较多,是一种
- Creo8.0产品结构设计-配套资料包
- Linux虚拟文件系统(VFS)原理及实验案例分析
- 多线程同步机制与生产者消费者问题的C语言实现-互斥锁、条件变量及Posix信号量的应用
- 2022年各城市PM2.5, PM10, SO2, NO2等环境空气质量数据
- Matlab simulink仿真 太阳能光伏系统搭建 包含有功、无功模块、3-2变等 通过改变id、iq数值可得出不同的波形,图2为纯有功,a相电压于相电流重合;图3为纯无功时,a相电压与a相电流
- 西门子博途1200 1500PLC多段曲线控温 (支持40段 控温曲线、曲线断电重启自动搜索、暂停、跳段等功能)
- 2021年各城市PM2.5, PM10, SO2, NO2等环境空气质量数据
- MATLAB代码:基于元模型优化的电厂主从博弈优化调度模型 关键词:元模型 电厂 主从博弈 优化调度 参考文档:《基于元模型优化算法的主从博弈多电厂动态定价和能量管理》复现元模型 仿真平台:MATLA
- 基于模型的六轴机器人阻抗力控制算法(matlab simscape,机器人模型可),视频中红色为期望轨迹,黑色为实际轨迹,工程可一键运行,可学到机器人阻抗力控制算法以及通过m文件设置simulink参
- 北京邮电大学数电实验自拟题目
- ABAQUS 、Opensees、Perform3d IDA曲线绘制,结构易损性评估 地震波选波调幅,易损性分析,曲线生成代码matlab函数,直接调用即可
- 基于51单片机的电机转速测量系统.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0