⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.~pas

📁 银行家算法 界面很有友好 很详细的 希望大家去看看
💻 ~PAS
📖 第 1 页 / 共 4 页
字号:
            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 + -