📄 unit2.~cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <stdlib.h>
#pragma hdrstop
#include "Unit2.h"
#pragma package(smart_init)
#pragma link "PERFGRAP"
#pragma resource "*.dfm"
#define getpcb(type) (type*)malloc(sizeof(type))
#define NULL 0
//---------------------------------------------------------------------------
TForm2 *Form2;
TMemo *Memo1;
TEdit *Edit1;
TLabel *Label1;
TLabel *Label2;
TEdit *Edit2;
TLabel *Label3;
TEdit *Edit3;
TLabel *Label4;
TLabel *Label5;
TEdit *Edit4;
TEdit *Edit5;
TButton *Button1;
void input();
creat(void) ;
insert();
void disp();
//void sort();
//int space();
void check();
running();
//void destory();
void testblock();//阻塞队列资源检测
void testnew();
int random();
void runmain();
void runFcfs();
void rescore();
//AnsiString str;
struct pcb{
int id; //进程序号
int ra; //所需资源A的数量
int rb; //所需资源B的数量
int rc; //所需资源C的数量
int ntime; //所需的时间片个数
int rtime; //已经运行的时间片个数
char state; //进程状态
struct pcb *next;
} *hready=NULL,*hblock=NULL,*p; //hready,hblock分别为指向就绪和阻塞队列
typedef struct pcb PCB;
int m,n,r,a,a1,b,b1,c,c1,h=0,i=1,time1Inteval; //m为要模拟的进程个数,n为初始化进程个数,a,b,c分别为A,B,C
//三类资源的总量 ,h为时间片运行的次数
//------------------------------------------------------------------------------
//建立一个PCB结构体型的空链表
PCB *increat(void)
{ PCB *head;
head=NULL;
return(head);
}
//------------------------------------------------------------------------------
//从链表起始地址开始输出该链表的内容
void disp(PCB *head)
{PCB *p1;
p1=head;
AnsiString str2;
if(head!=NULL) //链表非空
{
do
{
str2+=" ";
str2+=IntToStr(p1->id);
str2+=" ";
str2+=(p1->state);
str2+=" ";
str2+=IntToStr(p1->ra);
str2+=" ";
str2+=IntToStr(p1->rb);
str2+=" ";
str2+=IntToStr(p1->rc);
str2+=" ";
str2+=IntToStr(p1->ntime);
str2+=" ";
str2+=IntToStr(p1->rtime);
str2+="\r\n";
p1=p1->next;
}while(p1!=NULL); //不断输出进程的信息,直到链尾!
} //if
else
{ str2+="\t\t该 队 列 中 没 有 进 程!\r\n" ;}
Form2->Memo1->Lines->Add(str2);
}//disp
//------------------------------------------------------------------------------
/*将进程插入到链尾*/
PCB *insert(PCB *head,PCB*pcb) //带两个指针形参
{PCB *pi,*p1;
p1=head;
pi=pcb;
if(head==NULL)
{head=pi;pi->next=NULL;}
else
{while(p1->next!=NULL)
{p1=p1->next;
}
p1->next=pi;
pi->next=NULL;}
return(head);
}
void input() //对进程进行初始化
{
AnsiString str1;
m=StrToInt (Form2->Edit1->Text); //读取填入的进程总数
n=StrToInt (Form2->Edit2->Text); //读取需初始化进程数
a=StrToInt (Form2->Edit3->Text); //读取A类资源的总数
b=StrToInt (Form2->Edit4->Text); //读取B类资源的总数
c=StrToInt (Form2->Edit5->Text); //读取C类资源的总数
time1Inteval=StrToInt(Form2->Edit6->Text);
a1=a;b1=b;c1=c;
Form2->Timer1->Interval=time1Inteval;
r=m-n;
for(i=1;i<=n;i++) //初始化进程信息,直到到达要初始化个数
{
p=getpcb(PCB);
p->id=i;
str1+=" 产生进程ID:";
str1+=IntToStr(p->id);
str1+="\r\n";
p->ra=(random(a-3)+3);
str1+=" 所需A类资源数:";
str1+=IntToStr(p->ra);
str1+="\r\n";
p->rb=(random(b));
str1+=" 所需B类资源数:";
str1+=IntToStr(p->ra);
str1+="\r\n";
p->rc=(random(c-2)+2);
str1+=" 所需C类资源数:";
str1+=IntToStr(p->ra);
str1+="\r\n";
p->ntime=(random(5)+1);
str1+=" 所需时间片个数:";
str1+=IntToStr(p->ntime);
str1+="\r\n";
p->rtime=0;
p->next=NULL;
if (((a-(p->ra))>=0)&&((b-(p->rb))>=0)&&((c-(p->rc))>=0)) //如果资源符合所需要求
{ //则写入就绪队列队尾
a=a-(p->ra); //当前所剩A类资源数目
b=b-(p->rb); //当前所剩B类资源数目
c=c-(p->rc); //当前所剩C类资源数目
p->state='W';
hready=insert(hready,p); //将进程插入就绪队列
}//if
else
{
p->state='B';
hblock=insert(hblock,p);
}
str1+=" 当前进程状态:";
str1+=(p->state);
str1+="\r\n";
str1+="\r\n";
}//for
Form2->Memo1->Lines->Add(str1);
}//input
//------------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void check() //输出就绪队列和阻塞队列的信息
{AnsiString str1,str2,str3;
str3+="\r\n" ;
str3+="= = = = = = = = = = = = = = = CPU时间片运行了: " ;
str3+=IntToStr(h);
str3+=" 次= = = = = = = = = = = = = = =\r\n";
Form2->Memo1->Lines->Add(str3);
str1+="*********************************当 前 就 绪 队 列 的 信 息" ;
str1+="*********************************\r\n" ;
str1+="进程ID 进程状态 A资源数 B资源数 C资源数 需要时间片 已运行时间片";
Form2->Memo1->Lines->Add(str1);
disp(hready);
str2+="*********************************当 前 阻 塞 队 列 的 信 息";
str2+="*********************************\r\n" ;
str2+="\r\n";
str2+="进程ID 进程状态 A资源数 B资源数 C资源数 需要时间片 已运行时间片";
Form2->Memo1->Lines->Add(str2);
disp(hblock);
}//check
//---------------------------------------------------------------------------
PCB *running(PCB *head) //运行就绪队列的头进程
{
PCB *p1;
p1=head;
AnsiString str4;
if(p1->next==NULL)
head=increat();
else
{head=p1->next;
}
p1->state='R'; //进程状态由就绪转向运行
(p1->rtime)++;
h++;
str4+="~~~~~~~~~~~~~~~~ 当前正在运行的进程ID是: ";
str4+=IntToStr(p1->id);
str4+=" ~~~~~~~~~~~~~~~~~~\r\n";
str4+="进程ID 进程状态 A资源数 B资源数 C资源数 需要时间片 已运行时间片\r\n";
str4+=" ";
str4+=IntToStr(p1->id);
str4+=" ";
str4+=(p1->state);
str4+=" ";
str4+=IntToStr(p1->ra);
str4+=" ";
str4+=IntToStr(p1->rb);
str4+=" ";
str4+=IntToStr(p1->rc);
str4+=" ";
str4+=IntToStr(p1->ntime);
str4+=" ";
str4+=IntToStr(p1->rtime);
str4+=" ";
Form2->Memo1->Lines->Add(str4);
if(p1->ntime==p1->rtime) //如果已经运行的时间片到达所需次数
{
str4+="\r\n\r\n\t\tID号为:";
str4+=IntToStr(p1->id);
str4+=" 的进程已经完成!!!";
Form2->Memo1->Lines->Add(str4);
a=a+(p1->ra);
b=b+(p1->rb);
c=c+(p1->rc);
free(p1); //释放当前指针
}
else
{
p1->state='W';
head=insert(head,p1);
}
return(head);
}//running
//---------------------------------------------------------------------------
void testblock() //检测当前资源数目是否满足阻塞队列里进程的需求
{PCB *p1,*p2;
p1=hblock;
p2=hblock;
AnsiString str5;
while((hblock!=NULL)&&(p1!=NULL))
{
if((a-(p1->ra)>=0)&&(b-(p1->rb)>=0)&& (c-(p1->rc)>=0)) //如果满足
{if(p1==hblock)
{
hblock=p1->next;
p1->state='W';
hready=insert(hready,p1); //将阻塞的进程插入就绪队列
a=a-(p->ra);
b=b-(p->rb);
c=c-(p->rc);
str5="\tID号为: " ;
str5+=IntToStr(p1->id);
str5+=" 的进程由阻塞队列转入就绪队列!\r\n";
p1=hblock;
} //if(p1==hblock)
else
{p2->next=p1->next;
p1->state='W';
hready=insert(hready,p1);
str5="\tID号为: " ;
str5+=IntToStr(p1->id);
str5+=" 的进程由阻塞队列转入就绪队列!\r\n";
p1=p2->next;
}//else
} //大if
else
{p2=p1;
p1=p1->next;
} //else
Form2->Memo1->Lines->Add(str5);
} //whlie
}//block
//---------------------------------------------------------------------------
void testnew() //检测是否有新的进程产生
{
int t;
AnsiString str6;
if(r>0)
{
t=random(9); //生成随机数
if(t<=7) //如果随机数小于等于7,则产生新进程,否则不产生
{
p=getpcb(PCB);
str6+="有新的进程申请加入:\r\n" ;
p->id=i++;
str6+="进程ID:";
str6+=IntToStr(p->id);
str6+="\r\n";
p->ra=(random(a-3));
str6+="所需A类资源数:";
str6+=IntToStr(p->ra);
str6+="\r\n";
p->rb=(random(b-3));
str6+="所需B类资源数:";
str6+=IntToStr(p->ra);
str6+="\r\n";
p->rc=(random(c-3));
str6+="所需C类资源数:";
str6+=IntToStr(p->ra);
str6+="\r\n";
p->ntime=(random(5)+1);
str6+="所需时间片个数:";
str6+=IntToStr(p->ntime);
str6+="\r\n";
p->rtime=0;
p->next=NULL;
if (((a-(p->ra))>=0)&&((b-(p->rb))>=0)&&((c-(p->rc))>=0))
{ //进程满足要求,进入阻塞队列
a=a-(p->ra);
b=b-(p->rb);
c=c-(p->rc);
p->state='w';
str6+="当前进程状态:";
str6+=(p->state);
str6+="\r\n";
hready=insert(hready,p);
str6+="资源满足新进程需求,该进程进入就绪队列!";
}//if
else //进程不满足要求,进入阻塞队列
{
p->state='B';
hblock=insert(hblock,p);
str6+="当前进程状态:";
str6+=(p->state);
str6+="\r\n";
str6+="资源不能满足新进程需求,该进程进入阻塞队列!" ;
}//else
}//for
Form2->Memo1->Lines->Add(str6);
}//if(r>0)
r--;
}//testnew
//---------------------------------------------------------------------------
void runmain() //运行的主函数
{
AnsiString str,str1;
input();
Form2->Timer1->Enabled=true;
str+="\r\n";
}
//---------------------------------------------------------------------------
void rescore()
{
if(a>a1) {Form2->Edit7->Text=IntToStr(a1);}
if(a<0) {Form2->Edit7->Text=0;}
if(a>=0&&a<a1) {Form2->Edit7->Text=IntToStr(a);}
if(b>b1) {Form2->Edit8->Text=IntToStr(b1);}
if(b<0) {Form2->Edit8->Text=0;}
if(b>=0&&b<=b1) {Form2->Edit8->Text=IntToStr(b); }
if(c>c1) {Form2->Edit9->Text=IntToStr(c1);}
if(c<0) {Form2->Edit9->Text=0;}
if(c>=0&&c<=c1) {Form2->Edit9->Text=IntToStr(c); }
}
//------------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
//button
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender) //开始模拟按钮
{
runmain();
Button1->Enabled=false;
Form2->Edit1->Enabled=false;
Form2->Edit2->Enabled=false;
Form2->Edit3->Enabled=false;
Form2->Edit4->Enabled=false;
Form2->Edit5->Enabled=false;
Form2->Edit6->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button2Click(TObject *Sender) //清除屏幕按钮
{
Form2->Memo1->Clear();
Button1->Enabled=true;
h=0;
Form2->Edit1->Enabled=true;
Form2->Edit2->Enabled=true;
Form2->Edit3->Enabled=true;
Form2->Edit4->Enabled=true;
Form2->Edit5->Enabled=true;
Form2->Edit6->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
Form2->Memo1->Clear();
Button1->Enabled=true;
h=0;
Form2->Edit1->Enabled=true;
Form2->Edit2->Enabled=true;
Form2->Edit3->Enabled=true;
Form2->Edit4->Enabled=true;
Form2->Edit5->Enabled=true;
Form2->Edit6->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1KeyPress(TObject *Sender, char &Key)
{
Form2->Memo1->Clear();
Button1->Enabled=true;
h=0;
Form2->Edit1->Enabled=true;
Form2->Edit2->Enabled=true;
Form2->Edit3->Enabled=true;
Form2->Edit4->Enabled=true;
Form2->Edit5->Enabled=true;
Form2->Edit6->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Timer1Timer(TObject *Sender)
{
runFcfs();
}
void runFcfs()
{ AnsiString str;
if(hready!=NULL) //如果就绪队列为非空,则不断运行,直到就绪队列为空为止
{
check();
hready=running(hready);
testblock();
testnew();
rescore() ;
}
else
{
Form2->Timer1->Enabled=false;
Form2->Edit7->Text=IntToStr(a1);
Form2->Edit8->Text=IntToStr(b1);
Form2->Edit9->Text=IntToStr(c1);
str+="\r\n\r\n<<<<<<<<<<<<<<<所 有 的 进 程 都 已 经 成 功 运 行 结 束 !>>>>>>>>>>>>>>";
Form2->Memo1->Lines->Add(str);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm2::N2Click(TObject *Sender)
{
runmain();
Button1->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::N8Click(TObject *Sender)
{
if(Form2->SaveDialog1->Execute())
{
FILE* fp=fopen(Form2->SaveDialog1->FileName.c_str(),"w");
if(fp==NULL)
{
MessageBox(NULL,"打开文件出错","信息",MB_OK);
return;
}
for(int i=0;i<Form2->Memo1->Lines->Count;i++)
{ fputs(Form2->Memo1->Lines->Strings[i].c_str(),fp);
fputc('\n',fp);
}
fclose(fp);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm2::N7Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -