📄 unit1.~pas
字号:
PriorM:=m;
for k:=0 to factsource do
begin
available[k]:=available[k]+allocation[j][k];
MiddleAvailable[m-1][k]:=available[k]; //第j个进程完成后,资源向量为MiddleAvailable[m]
end;
end
else
begin
finish[j][0]:=false;
finish[j][1]:=false;
finish[j][2]:=false;
end;
end;
if(m>=process) then//*所有进程可都完成了*/
begin
success:=true;
break;
end;
if(HaveProcessFinish=false) then//*存在不可完的进程*/
begin
//printf(" During the scanning,none process can finish!");
success:=false;
break;
end;
end;
Memo1.Text:='经分析,可完成的进程有:'+str;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
i:integer;
str:string;
begin
//不存在安全序列
if PriorM<5 then
begin
m:=0;
showmessage('不存在安全序列!');
str:='不存在安全序列! 因为只有以下进程可完成:';
for i:=0 to PriorM-1 do
begin
str:=str+' P'+IntToStr(where[i]+1)+',';
case where[i] of
0:begin
F1.Text:='√';
// N11.Text:='0'; N12.Text:='0'; N13.Text:='0';
end;
1:begin
F2.Text:='√';
// N21.Text:='0'; N22.Text:='0'; N23.Text:='0';
end;
2:begin
F3.Text:='√';
// N31.Text:='0'; N32.Text:='0'; N33.Text:='0';
end;
3:begin
F4.Text:='√';
// N41.Text:='0'; N42.Text:='0'; N43.Text:='0';
end;
4:begin
F5.Text:='√';
// N51.Text:='0'; N52.Text:='0'; N53.Text:='0';
end;
end; //end case
end;
Memo1.Text:=str;
PriorM:=0;
exit;
end;
//存在安全序列
//更新界面
if compareStr(BitBtn1.Caption,'开始')=0 then
BitBtn1.Caption:='下一步';
if compareStr(BitBtn1.Caption,'重新演示')=0 then
BitBtn1.Caption:='下一步';
if compareStr(BitBtn1.Caption,'结束')=0 then
begin
BitBtn1.Caption:='重新演示';
F1.Text:='×'; F2.Text:='×'; F3.Text:='×';
F4.Text:='×'; F5.Text:='×';
m:=PriorM;
end;
if m>0 then
begin //更新available的显示
K11.Text:=IntToStr(MiddleAvailable[PriorM-m][0]);
K12.Text:=IntToStr(MiddleAvailable[PriorM-m][1]);
K13.Text:=IntToStr(MiddleAvailable[PriorM-m][2]);
end;
//更新完成状态显示
case where[PriorM-m] of
0:begin
F1.Text:='√';
// N11.Text:='0'; N12.Text:='0'; N13.Text:='0';
Memo1.Text:='进程1已完成!';
end;
1:begin
F2.Text:='√';
// showmessage(f2.Text);
// N21.Text:='0'; N22.Text:='0'; N23.Text:='0';
Memo1.Text:='进程2已完成!';
end;
2:begin
F3.Text:='√';
// N31.Text:='0'; N32.Text:='0'; N33.Text:='0';
Memo1.Text:='进程3已完成!';
end;
3:begin
F4.Text:='√';
// N41.Text:='0'; N42.Text:='0'; N43.Text:='0';
Memo1.Text:='进程4已完成!';
end;
4:begin
F5.Text:='√';
// N51.Text:='0'; N52.Text:='0'; N53.Text:='0';
Memo1.Text:='进程5已完成!';
end;
end;
if m=1 then
begin
m:=PriorM;
BitBtn1.Caption:='结束';
str:='安全序列为:';
for i:=0 to PriorM-1 do
str:=str+'P'+IntTostr(where[i]+1)+',';
Memo1.Text:=str;
end;
m:=m-1;
end;
procedure TForm1.BitBtn5Click(Sender: TObject);
var
i:integer;
str:string;
begin
//更新界面
BitBtn1.Enabled:=false;
//扫描,计算
if BitBtn3.Enabled=false then
form1.test; //银行家算法
//不存在安全序列
if PriorM<5 then
begin
m:=0;
showmessage('不存在安全序列!');
str:='不存在安全序列! 因为只有以下进程可完成:';
for i:=0 to PriorM-1 do
begin
str:=str+' P'+IntToStr(where[i]+1)+',';
case where[i] of
0:begin
F1.Text:='√';
// N11.Text:='0'; N12.Text:='0'; N13.Text:='0';
end;
1:begin
F2.Text:='√';
// N21.Text:='0'; N22.Text:='0'; N23.Text:='0';
end;
2:begin
F3.Text:='√';
// N31.Text:='0'; N32.Text:='0'; N33.Text:='0';
end;
3:begin
F4.Text:='√';
// N41.Text:='0'; N42.Text:='0'; N43.Text:='0';
end;
4:begin
F5.Text:='√';
// N51.Text:='0'; N52.Text:='0'; N53.Text:='0';
end;
end; //end case
end;
Memo1.Text:=str;
PriorM:=0;
exit;
end;
//存在安全序列
str:='安全序列为:';
for i:=0 to PriorM-1 do
str:=str+'P'+IntTostr(where[i]+1)+',';
Memo1.Text:=str;
F1.Text:='√';
F2.Text:='√';
F3.Text:='√';
F4.Text:='√';
F5.Text:='√';
end;
procedure TForm1.InitialData;
begin
M11.Text:='2'; M12.Text:='15'; M13.Text:='3';
M21.Text:='3'; M22.Text:='2'; M23.Text:='2';
M31.Text:='9'; M32.Text:='0'; M33.Text:='2';
M41.Text:='2'; M42.Text:='2'; M43.Text:='2';
M51.Text:='4'; M52.Text:='3'; M53.Text:='3';
Y11.Text:='0'; Y12.Text:='1'; Y13.Text:='0';
Y21.Text:='2'; Y22.Text:='0'; Y23.Text:='0';
Y31.Text:='3'; Y32.Text:='0'; Y33.Text:='2';
Y41.Text:='2'; Y42.Text:='1'; Y43.Text:='1';
Y51.Text:='0'; Y52.Text:='0'; Y53.Text:='2';
K11.Text:='3'; K12.Text:='3'; K13.Text:='2';
TextToInt1;
IntToText1;
end;
procedure TForm1.BitBtn7Click(Sender: TObject);
begin
if(NowHandUpWork<=10) then
begin
HandUpWork(NowHandUpWork);
NowHandUpWork:=NowHandUpWork+1;
end;
printf;
end;
procedure TForm1.InitialData2;
begin
group[0].size:=8; group[0].ReachTime:=1; group[0].DoTime:=14; group[0].Finish:='后备';
group[1].size:=21; group[1].ReachTime:=3; group[1].DoTime:=21; group[1].Finish:='后备';
group[2].size:=12; group[2].ReachTime:=6; group[2].DoTime:=10; group[2].Finish:='后备';
group[3].size:=32; group[3].ReachTime:=8; group[3].DoTime:=13; group[3].Finish:='后备';
group[4].size:=43; group[4].ReachTime:=11; group[4].DoTime:=17; group[4].Finish:='后备';
group[5].size:=8; group[5].ReachTime:=14; group[5].DoTime:=29; group[5].Finish:='后备';
group[6].size:=4; group[6].ReachTime:=21; group[6].DoTime:=31; group[6].Finish:='后备';
group[7].size:=98; group[7].ReachTime:=25; group[7].DoTime:=9; group[7].Finish:='后备';
group[8].size:=68; group[8].ReachTime:=29; group[8].DoTime:=41; group[8].Finish:='后备';
group[9].size:=71; group[9].ReachTime:=45; group[9].DoTime:=4; group[9].Finish:='后备';
Num:=1;
table[Num-1].Number:=Num;
table[Num-1].Size:=300;
table[Num-1].Position:=0;
table[num-1].finish:='可用';//表示可用
Numed:=0;
IntToText;
NowHandUpWork:=0;
ExitData:=false;
if (exitData=false)then
if HandUpWork(NowHandUpWork)=true then printf;
NowHandUpWork:=1;
if (exitData=false)then
if HandUpWork(NowHandUpWork)=true then printf;
NowHandUpWork:=2;
end;
procedure TForm1.IntToText;
begin
s1.Text:=IntToStr(group[0].size); R1.Text:=IntToStr(group[0].ReachTime); D1.Text:=IntToStr(group[0].DoTime);
W1.Text:=group[0].Finish;
s2.Text:=IntToStr(group[1].size); R2.Text:=IntToStr(group[1].ReachTime); D2.Text:=IntToStr(group[1].DoTime);
W2.Text:=group[1].Finish;
s3.Text:=IntToStr(group[2].size); R3.Text:=IntToStr(group[2].ReachTime); D3.Text:=IntToStr(group[2].DoTime);
W3.Text:=group[2].Finish;
s4.Text:=IntToStr(group[3].size); R4.Text:=IntToStr(group[3].ReachTime); D4.Text:=IntToStr(group[3].DoTime);
W4.Text:=group[3].Finish;
s5.Text:=IntToStr(group[4].size); R5.Text:=IntToStr(group[4].ReachTime); D5.Text:=IntToStr(group[4].DoTime);
W5.Text:=group[4].Finish;
s6.Text:=IntToStr(group[5].size); R6.Text:=IntToStr(group[5].ReachTime); D6.Text:=IntToStr(group[5].DoTime);
W6.Text:=group[5].Finish;
s7.Text:=IntToStr(group[6].size); R7.Text:=IntToStr(group[6].ReachTime); D7.Text:=IntToStr(group[6].DoTime);
W7.Text:=group[6].Finish;
s8.Text:=IntToStr(group[7].size); R8.Text:=IntToStr(group[7].ReachTime); D8.Text:=IntToStr(group[7].DoTime);
W8.Text:=group[7].Finish;
s9.Text:=IntToStr(group[8].size); R9.Text:=IntToStr(group[8].ReachTime); D9.Text:=IntToStr(group[8].DoTime);
W9.Text:=group[8].Finish;
s10.Text:=IntToStr(group[9].size); R10.Text:=IntToStr(group[9].ReachTime); D10.Text:=IntToStr(group[9].DoTime);
W10.Text:=group[9].Finish;
FT1.Text:=IntToStr(group[0].ReachTime+group[0].DoTime);
FT2.Text:=IntToStr(group[1].ReachTime+group[1].DoTime);
FT3.Text:=IntToStr(group[2].ReachTime+group[2].DoTime);
FT4.Text:=IntToStr(group[3].ReachTime+group[3].DoTime);
FT5.Text:=IntToStr(group[4].ReachTime+group[4].DoTime);
FT6.Text:=IntToStr(group[5].ReachTime+group[5].DoTime);
FT7.Text:=IntToStr(group[6].ReachTime+group[6].DoTime);
FT8.Text:=IntToStr(group[7].ReachTime+group[7].DoTime);
FT9.Text:=IntToStr(group[8].ReachTime+group[8].DoTime);
FT10.Text:=IntToStr(group[9].ReachTime+group[9].DoTime);
end;
procedure TForm1.TextToInt;
begin
group[0].size:= StrToInt(S1.Text); group[0].ReachTime:=StrToInt(R1.Text);
group[0].DoTime:=strToInt(D1.Text); group[0].Finish:='后备';
group[1].size:= StrToInt(S2.Text); group[1].ReachTime:=StrToInt(R2.Text);
group[1].DoTime:=strToInt(D2.Text); group[1].Finish:='后备';
group[2].size:= StrToInt(S3.Text); group[2].ReachTime:=StrToInt(R3.Text);
group[2].DoTime:=strToInt(D3.Text); group[2].Finish:='后备';
group[3].size:= StrToInt(S4.Text); group[3].ReachTime:=StrToInt(R4.Text);
group[3].DoTime:=strToInt(D4.Text); group[3].Finish:='后备';
group[4].size:= StrToInt(S5.Text); group[4].ReachTime:=StrToInt(R5.Text);
group[4].DoTime:=strToInt(D5.Text); group[4].Finish:='后备';
group[5].size:= StrToInt(S6.Text); group[5].ReachTime:=StrToInt(R6.Text);
group[5].DoTime:=strToInt(D6.Text); group[5].Finish:='后备';
group[6].size:= StrToInt(S7.Text); group[6].ReachTime:=StrToInt(R7.Text);
group[6].DoTime:=strToInt(D7.Text); group[6].Finish:='后备';
group[7].size:= StrToInt(S8.Text); group[7].ReachTime:=StrToInt(R8.Text);
group[7].DoTime:=strToInt(D8.Text); group[7].Finish:='后备';
group[8].size:= StrToInt(S9.Text); group[8].ReachTime:=StrToInt(R9.Text);
group[8].DoTime:=strToInt(D9.Text); group[8].Finish:='后备';
group[9].size:= StrToInt(S10.Text); group[9].ReachTime:=StrToInt(R10.Text);
group[9].DoTime:=strToInt(D10.Text); group[9].Finish:='后备';
end;
procedure TForm1.BitBtn8Click(Sender: TObject);
begin
close;
end;
procedure TForm1.nextClick(Sender: TObject);
begin
TextToInt;
end;
procedure TForm1.printf;
var
clNum,clNumEnd,i,PixelStart,PixelEnd,PixelHeight,PixelColor:integer;
begin
//画背景
image1.Canvas.Brush.color:=clHotLight;
image1.Canvas.Pen.Color:=clRed;
image1.Canvas.Rectangle(0,0,image1.Width,300);
image2.Canvas.Brush.color:=clHotLight;
image2.Canvas.Pen.Color:=clRed;
image2.Canvas.Rectangle(0,0,image2.Width,300);
image3.Canvas.Brush.color:=clHotLight;
image3.Canvas.Pen.Color:=clRed;
image3.Canvas.Rectangle(0,0,image3.Width,300);
for i:=0 to 9 do
begin
with group[i] do
begin
if (finish<>'运行') then continue;
clNum:=1;
clNumEnd:=-1;//表示PixelEnd不会越界,即在一个Image中可画完
PixelStart:=Position*3;
pixelHeight:=size*3;
PixelEnd:=PixelStart+pixelHeight;
//调整pixelstart
if (PixelStart>=300) and (PixelStart<600)then //从第二个image开始画
begin
PixelStart:=PixelStart-300;
clNum:=2;
end
else if (PixelStart>=600) and (PixelStart<900) then //从第三个image开始画
begin
PixelStart:=PixelStart-600;
clNum:=3;
end;
//调整pixelend
if(PixelEnd>=300) and(PixelEnd<600) and (clNum=1) then //第一个image不够画
begin
PixelEnd:=PixelEnd-300;
clNumEnd:=1;
end
else if (PixelEnd>=600) and (PixelEnd<900) and (clNum=2) then //第二个image不够画
begin
PixelEnd:=PixelEnd-600;
clNumEnd:=2;
end;
PixelColor:=i+1;
case Pixelcolor of
1: if clNum=1 then //从第一个image开始画
begin
if (clNumEnd=-1) then
begin
image1.Canvas.Brush.Color:=clAqua;
image1.Canvas.Rectangle(0,PixelStart,70,PixelStart+PixelHeight);
end
else if(clNumend=1) then//第一个image不够画
begin
image1.Canvas.Brush.Color:=clAqua;
image2.Canvas.Brush.Color:=clAqua;
image1.Canvas.Rectangle(0,PixelStart,70,300);
image2.Canvas.Rectangle(0,0,70,PixelEnd);
end;
end
else if clNum=2 then//从第二个image开始画
begin
if (clNumEnd=-1) then
begin
image2.Canvas.Brush.Color:=clAqua;
image2.Canvas.Rectangle(0,PixelStart,70,PixelStart+PixelHeight);
end
else if(clNumend=2) then//第二个image不够画
begin
image2.Canvas.Brush.Color:=clAqua;
image3.Canvas.Brush.Color:=clAqua;
image2.Canvas.Rectangle(0,PixelStart,70,300);
image3.Canvas.Rectangle(0,0,70,PixelEnd);
end;
end
else if clNum=3 then //从第三个image开始画
begin
image3.Canvas.Brush.Color:=clAqua;
image3.Canvas.Rectangle(0,PixelStart,70,PixelStart+PixelHeight);
end;
2: if clNum=1 then //从第一个image开始画
begin
if (clNumEnd=-1) then
begin
image1.Canvas.Brush.Color:=clMaroon;
image1.Canvas.Rectangle(0,PixelStart,70,PixelStart+PixelHeight);
end
else if(clNumend=1) then//第一个image不够画
begin
image1.Canvas.Brush.Color:=clMaroon;
image2.Canvas.Brush.Color:=clMaroon;
image1.Canvas.Rectangle(0,PixelStart,70,300);
image2.Canvas.Rectangle(0,0,70,PixelEnd);
end;
end
else if clNum=2 then//从第二个image开始画
begin
if (clNumEnd=-1) then
begin
image2.Canvas.Brush.Color:=clMaroon;
image2.Canvas.Rectangle(0,PixelStart,70,PixelStart+PixelHeight);
end
else if(clNumend=2) then//第二个image不够画
begin
image2.Canvas.Brush.Color:=clMaroon;
image3.Canvas.Brush.Color:=clMaroon;
image2.Canvas.Rectangle(0,PixelStart,70,300);
image3.Canvas.Rectangle(0,0,70,PixelEnd);
end;
end
else if clNum=3 then //从第三个image开始画
begin
image3.Canvas.Brush.Color:=clMaroon;
image3.Canvas.Rectangle(0,PixelStart,70,PixelStart+PixelHeight);
end;
3: if clNum=1 then //从第一个image开始画
begin
if (clNumEnd=-1) then
begin
image1.Canvas.Brush.Color:=clGreen;
image1.Canvas.Rectangle(0,PixelStart,70,PixelStart+PixelHeight);
end
else if(clNumend=1) then//第一个image不够画
begin
image1.Canvas.Brush.Color:=clGreen;
image2.Canvas.Brush.Color:=clGreen;
image1.Canvas.Rectangle(0,PixelStart,70,300);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -