#include <QMessageBox>
#include <QDebug>
#include <algorithm>
#include "priorityscheduling.h"
#include "ui_priorityscheduling.h"
using namespace std;
PriorityScheduling::PriorityScheduling(int nums,int CPUnums,QWidget *parent) :
QWidget(parent),
ui(new Ui::PriorityScheduling)
{
ui->setupUi(this);
number=nums;
CPUnumber=CPUnums;
ui->cpu_label->setText("CPU数:"+QString::number(CPUnums));
ui->num_label->setText("道数:"+QString::number(nums));
this->setWindowTitle("CJM's CPU-Priority-Scheduling Program");
isAuto_Create=false;
for(int i=0;i<CPUnumber;i++)
{
CPUprocess.append("空");
}
InitPeaceTable(&tableHead);
ShowReadyQueue();
ShowSuspendQueue();
ShowReserveQueue();
GoReadyQueue();
ShowPeaceTable(&tableHead);
ShowCPUprocess();
ShowFinshedQueue();
timer=new QTimer(this);
connect(timer,&QTimer::timeout,this,&PriorityScheduling::UpdateProcess);
timer->start(1000);
timer1=new QTimer(this);
connect(timer1,&QTimer::timeout,this,&PriorityScheduling::Auto_CreateProcess);
timer1->start(2000);
setFixedSize(this->width(),this->height());
}
PriorityScheduling::~PriorityScheduling()
{
delete ui;
}
void PriorityScheduling::InitPeaceTable(memoryNode* p)
{
p->address = 100;
p->length = 1000;
p->state = 0;
p->workName = "";
p->left=nullptr;
p->right=nullptr;
qDebug()<<"初始化完成!";
}
bool PriorityScheduling::InsertProcess(memoryNode *p, int length, QString workName)
{
if(p!=nullptr)
{
if((p->state==0)&&(length<=p->length)&&(p->left==nullptr)&&(p->right==nullptr))
{
memoryNode* m1=new memoryNode();
memoryNode* m2=new memoryNode();
m1->workName=workName;
m2->workName="";
m1->address=p->address;
m1->state=1;
m1->length=length;
m2->address=m1->address+length;
m2->length=p->length-m1->length;
m2->state=0;
p->left=m1;
p->right=m2;
m1->left=nullptr;
m1->right=nullptr;
m2->left=nullptr;
m2->right=nullptr;
p->state=1;
return true;
}
else {
return InsertProcess(p->left,length,workName) || InsertProcess(p->right,length,workName);
}
}
return false;
}
void PriorityScheduling::getMemoryTable(memoryNode *p, QVector<memoryNode *> &memorytable)
{
if(p!=nullptr)
{
if(p->left==nullptr && p->right==nullptr)
{
memorytable.append(p);
}
if(p->left) getMemoryTable(p->left,memorytable);
if(p->right) getMemoryTable(p->right,memorytable);
}
}
void PriorityScheduling::Mix_1(memoryNode *p)
{
if(p!=nullptr && p->left!=nullptr)
{
if(p->left->left==nullptr && p->right->right==nullptr && p->left->state==0 && p->right->state==0)
{
p->state=0;
auto x=p->left;
auto y=p->right;
p->left=nullptr;
p->right=nullptr;
delete x;
delete y;
}
Mix_1(p->left);
Mix_1(p->right);
}
}
void PriorityScheduling::Mix_2(memoryNode *p)
{
if(p->left!=nullptr && p->right->left!=nullptr)
{
if(p->left->state==0&&p->right->left->state==0)
{
p->left->length=p->right->right->address;
p->right=p->right->right;
}
Mix_2(p->left);
Mix_2(p->right);
}
}
void PriorityScheduling::DeleteProcess(memoryNode *p, QString workName)
{
if(p!=nullptr)
{
if(p->workName==workName)
{
p->workName="";
p->state=0;
}
DeleteProcess(p->left,workName);
DeleteProcess(p->right,workName);
}
}
void PriorityScheduling::ShowPeaceTable(memoryNode *p)
{
QVector<memoryNode*>memory;
getMemoryTable(p,memory);
ui->peaceTable->clear();
ui->peaceTable->setWindowTitle("主存分区表");
int size=memory.size();
ui->peaceTable->setColumnCount(6);
ui->peaceTable->setRowCount(size+10);
ui->peaceTable->setHorizontalHeaderLabels(QStringList()<<"序号"<<"进程名"<<"开始地址"<<"结束地址"<<"长度"<<"状态");
ui->peaceTable->verticalHeader()->setVisible(false);
ui->peaceTable->setSelectionBehavior(QAbstractItemView::SelectItems);
ui->peaceTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
QTableWidgetItem* i0=new QTableWidgetItem("#");
QTableWidgetItem* i1=new QTableWidgetItem("操作系统进程");
QTableWidgetItem* i2=new QTableWidgetItem("0");
QTableWidgetItem* i3=new QTableWidgetItem("100");
QTableWidgetItem* i4=new QTableWidgetItem("100");
QTableWidgetItem* i5=new QTableWidgetItem("正在使用");
ui->peaceTable->setItem(0,0,i0);
ui->peaceTable->setItem(0,1,i1);
ui->peaceTable->setItem(0,2,i2);
ui->peaceTable->setItem(0,3,i3);
ui->peaceTable->setItem(0,4,i4);
ui->peaceTable->setItem(0,5,i5);
for(int i=0;i<memory.size();i++)
{
auto m=memory[i];
QTableWidgetItem* item0=new QTableWidgetItem(QString::number(i,10));
QTableWidgetItem* item1=new QTableWidgetItem(m->workName);
QTableWidgetItem* item2=new QTableWidgetItem(QString::number(m->address,10));
QTableWidgetItem* item3=new QTableWidgetItem(QString::number(m->address+m->length),10);
QTableWidgetItem* item4=new QTableWidgetItem(QString::number(m->length,10));
QString state;
if(m->state==0)
state="空闲";
else
state="正在使用";
QTableWidgetItem* item5=new QTableWidgetItem(state);
ui->peaceTable->setItem(i+1,0,item0);
ui->peaceTable->setItem(i+1,1,item1);
ui->peaceTable->setItem(i+1,2,item2);
ui->peaceTable->setItem(i+1,3,item3);
ui->peaceTable->setItem(i+1,4,item4);
ui->peaceTable->setItem(i+1,5,item5);
}
ui->peaceTable->show();
memoryTable=memory;
}
void PriorityScheduling::ShowReserveQueue()
{
ui->outpeaceTable->clear();
ui->outpeaceTable->setWindowTitle("后备队列");
int size=reserveQueue.size();
ui->outpeaceTable->setColumnCount(5);
ui->outpeaceTable->setRowCount(size+5);
ui->outpeaceTable->setHorizontalHeaderLabels(QStringList() << "pid" << "剩余运行时间" << "已运行时间" << "优先级" << "状态");
ui->outpeaceTable->verticalHeader()->setVisible(false);
ui->outpeaceTable->setSelectionBehavior(QAbstractItemView::SelectItems);
ui->outpeaceTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
for(int i=0;i<size;i++)
{
PCB pcb=reserveQueue[i];
QTableWidgetItem* item1=new QTableWidgetItem(pcb.pid);
QTableWidgetItem* item2=new QTableWidgetItem(QString::number(pcb.runTime-pcb.doneTime,10));
QTableWidgetItem* item3=new QTableWidgetItem(QString::number(pcb.doneTime,10));
QTableWidgetItem* item4=new QTableWidgetItem(QString::number(pcb.priority,10));
QTableWidgetItem* item5=new QTableWidgetItem("new/ready");
ui->outpeaceTable->setItem(i,0,item1);
ui->outpeaceTable->setItem(i,1,item2);
ui->outpeaceTable->setItem(i,2,item3);
ui->outpeaceTable->setItem(i,3,item4);
ui->outpeaceTable->setItem(i,4,item5);
}
}
void PriorityScheduling::ShowSuspendQueue()
{
ui->outpeaceTable2->clear();
ui->outpeaceTable2->setWindowTitle("挂起队列");
int size=suspendQueue.size();
ui->outpeaceTable2->setColumnCount(5);
ui->outpeaceTable2->setRowCount(size+5);
ui->outpeaceTable2->setHorizontalHeaderLabels(QStringList() << "pid" << "剩余运行时间" << "已运行时间" << "优先级" << "状态");
ui->outpeaceTable2->verticalHeader()->setVisible(false);
ui->outpeaceTable2->setSelectionBehavior(QAbstractItemView::SelectItems);
ui->outpeaceTable2->setSelectionMode(QAbstractItemV
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、存储设备、移动设备等 操作系统:LInux、IOS、树莓派、安卓开发、微机操作系统、网络操作系统、分布式操作系统等。此外,还有嵌入式操作系统、智能操作系统等。 网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络与通信是一个非常广泛的领域,它涉及到计算机科学、电子工程、数学等多个学科的知识。 云计算与大数据:数据集、包括云计算平台、大数据分析、人工智能、机器学习等,云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。
资源推荐
资源详情
资源评论
收起资源包目录
OS课实验课设--使用QT构建的GUI程序模拟操作系统进程和内存调度 (纯摆烂作.zip (10个子文件)
cm
CPU-Scheduling.pro.user 24KB
mainwindow.h 470B
mainwindow.cpp 1KB
resourse.h 906B
main.cpp 219B
mainwindow.ui 3KB
priorityscheduling.h 2KB
priorityscheduling.cpp 19KB
CPU-Scheduling.pro 1KB
priorityscheduling.ui 7KB
共 10 条
- 1
资源评论
妄北y
- 粉丝: 1w+
- 资源: 1万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功