亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? define.pas

?? 40層樓的10部電梯載客仿真情況,采用delphi多線程技術實現
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
unit Define;

interface

uses
  Classes,Forms,Controls,Windows,comctrls,stdctrls,Sysutils,grids,Dialogs;

Const
   MaxFloor     = 40;      //最大樓梯層
   MaxPerson    = 1000;    //最大仿真人數
   MaxElavotor  = 10;      //最大電梯數
   ElavotorStatus_Idle   = 0;  //電梯空閑狀態
   ElavotorStatus_UP     = 1;  //電梯上行狀態
   ElavotorStatus_Down   = 2;  //電梯下行狀態
   PersonStatus_idle     = 0;  //人員停留狀態
   PersonStatus_Request  = 1;  //人員請求狀態
   PersonStatus_Taking   = 2;  //人員乘梯狀態
type

//定義線程對象
  TRunThread = class(TThread)
     private
       ElavotorID:integer;
     protected
        procedure RuningElavotor; //線程仿真電梯運行
        procedure Runing(ElavotorID:integer); //線程仿真電梯運行
        procedure Execute; override;
  end;

  TSystemMonitor = class(TThread)
     private
     protected
        procedure Monitor; //線程仿真電梯運行
        procedure Execute; override;
  end;

//定義電梯對象
  TElavotor = class
     private
     protected
     public
       	Speed:integer;                  //速度
        Direction:integer;              //電梯運行方向 “0=idle" "1=up" "2=down"
        MaxLoadCapacity:integer;        //電梯最大載客量
	CurrentLoadCapacity:integer;    //電梯當前載客量
        DestFloorLayer:integer;         //電梯目標樓層
        isFull:Boolean;                 //電梯滿員
	nIdleTime:integer;              //空閑時間計數器
	nBusyTime:integer;              //工作時間計數器
        CurrentStatus:integer;          //電梯當前狀態 "idle" "up" "down"
	PersonTotal:integer;            //總完成承載人數
	ID:integer;                     //電梯編號
	CurrentFloor:integer;           //電梯當前所處樓層
        UpDownTime:integer;             //每人上下電梯時間
        OSdelaytime:integer;            //電梯開關門時間
        OuterRequestArray:TStringList;  //等待隊列 "xx-xx"
        InsideRequestArray:TStringList; //等待隊列 "12-35"
     procedure OpenDoor(DelayTime:integer);  //開門
     procedure CloseDoor(DelayTime:integer); //關門
     Procedure UPrun;                        //上行
     Procedure Downrun;                      //下行
     Procedure Continuerun;                  //繼續運行
     Function  CheckStop(CurrentFloor:integer):Boolean;  //檢查當前層是否有人上下
     Procedure TakeElavotor(CurrentFloor:integer);      //乘梯
  end;

//定義人員對象
  TPerson = Class
     Private
     Protected
     public
	Direction:integer;          //請求的方向   "0=idle" "1=Up" "2=Down"
	FinishedCount:integer;       //目前已乘坐次數
	DestinationFloor:integer;   //請求目標樓層
	CurrentFloor:integer;       //目前所處樓層
	PersonID:integer;           //人員編號
        SelectedElavotorID:integer; //選擇要乘的電梯編號
        PersonStatus:integer;       //當前狀態 "Request" "idle" "Taking"
        idle_Time:integer;          //人員停留時間
        Request_Time:integer;       //人員請求時間
        Taking_Time:integer;        //人員乘梯時間
        MissionCompleted:Boolean;       //是否結束仿真任務
      Function ChooseElavotor(CurrentFloor,DestinationFloor:integer):integer;//選擇合適的電梯
      Procedure SendRequest(CurrentFloor,DestinationFloor:integer);       //發送乘梯請求
  end;

//定義樓層對象
  TFloor = class
     private
     protected
     public
        Requestlist:TStringList;       //請求乘梯隊列
        Idlelist:TStringList;          //空閑隊列 "UserID-CurTime-IdleTime"
   end;

//定義系統控制對象
  TSystemControl = Class
     private
     protected
     public
        CurrentPersonTotal:integer;           //當前已經到達大廈的人數
        FinishedPersonTotal:integer;          //當前已經完成乘梯任務的人數
        SimTimeTotal:integer;                 //系統計數器
        NewPerson:integer;                    //新到人數
       Procedure Initsystem;                 //初始化系統
       Function InitAddedPerson:integer;     //初始化新到來的人對象
       Procedure Statistic;                  //系統實時統計
   end;
   
   function Finduser(arraylist:TStringList;userId:integer):Boolean; //尋找隊列中是否已經存在該客戶
   function CanTake(ElavotorID,Destlayer:integer):Boolean;   //目標樓層是否可以直接到達
var
   Maxload :integer;                     //電梯最大乘客量
   PersonNum:integer;                    //參與仿真人數
   Ontime:integer;                       //人員到齊時間
   ElavotorSpeed:integer;                //電梯運行速度
   UpDownTime:integer;                   //上下電梯時間
   TakeNum:integer;                      //乘做電梯次數
   Elavotor:array[0..9] of TElavotor;    //電梯實例對象
   RunThread:array[0..9] of TRunThread;  //運行電梯線程實例對象
   Floor:array[1..40] of TFloor;         //定義樓梯實例對象
   Person:array of Tperson;              //定義動態人員列表
   SystemControl:TSystemControl;         //系統控制對象
   SystemMonitor:TsystemMonitor;         //系統監控線程實例對象
   ElavotorTrack:array[0..9] of TTrackBar;           //顯示電梯進度
   Elavotor_idle_Label:array[0..9] of TStaticText;   //顯示空閑時間
   Elavotor_Busy_Label:array[0..9] of TStaticText;   //顯示運行時間
   Elavotor_Memo:array[0..9] of TMemo;               //顯示電梯內部運載情況
   ShowFloor:TstringGrid;                            //顯示樓層人員停留
   DelIdle:Tstringlist;                              //臨時刪除隊列
implementation
uses main;
{ TRunThread }

function Finduser(arraylist:TStringList;userId:integer):Boolean;
var i,j:integer;
    Tempstr,str,StrEID,strFloor:string;
begin
   Result:=False;
   for i:=0 to arraylist.Count-1 Do
     begin
       Tempstr:=arraylist.Strings[i];           //等待信息
       Str:=Copy(Tempstr,0,pos('-',Tempstr)-1); //取得乘客編號
       StrEID:=Copy(Tempstr,pos(':',Tempstr)+1,
         length(tempstr)-pos(':',Tempstr)+1);   //取得所等待的電梯編號
       if Strtoint(Str)=userId then             //當前乘客是否存在
         begin
           Result:=True;
           if Person[userId].SelectedElavotorID<>Strtoint(StrEID) then //是否改變所乘電梯
              begin
                strFloor:=copy(Tempstr,0,pos(':',Tempstr)-1);
                Elavotor[Strtoint(StrEID)].OuterRequestArray.Delete(            //刪除不合適等待隊列
                  Elavotor[Strtoint(StrEID)].OuterRequestArray.indexof(strFloor));
                Floor[Person[userId].CurrentFloor].Requestlist.Delete(
                  Floor[Person[userId].CurrentFloor].Requestlist.indexof(Tempstr));
                Person[userId].SendRequest(Person[userId].CurrentFloor,        //選擇另外一個電梯
                   Person[userId].DestinationFloor);
              end;
           Exit;
         end;
     end;
end;

procedure TRunThread.RuningElavotor;
begin
   self.Runing(self.ElavotorID);
end;

procedure TRunThread.Runing(ElavotorID: integer);
begin
   Elavotor[ElavotorID].Continuerun;
   Application.ProcessMessages;
end;

procedure TRunThread.Execute;
begin
  while not self.Terminated DO
    begin
       Synchronize(RuningElavotor);
       sleep(1000);
    end;
end;

function TSystemControl.InitAddedPerson: integer;
var i,iTemp:integer;
begin
  Result:=0;
  //人員隨機到齊
  if self.CurrentPersonTotal>=PersonNum then
    begin
      Result:=1;
      exit;
    end else if (PersonNum-self.CurrentPersonTotal)<5 then
      begin
        Self.NewPerson:=PersonNum-self.CurrentPersonTotal;
      end else Self.NewPerson:=Random(5);

     if Self.NewPerson = 0 then exit;
       iTemp:=self.CurrentPersonTotal+Self.NewPerson;
       if iTemp>PersonNum then
          begin
            Self.NewPerson:=PersonNum + self.CurrentPersonTotal;
            iTemp:=PersonNum;
            exit;
          end;
  Setlength(Person,iTemp);
  for i:=0 to self.NewPerson-1 Do
   try
      person[self.CurrentPersonTotal+i]:=Tperson.Create;
      person[self.CurrentPersonTotal+i].FinishedCount:=0;
      person[self.CurrentPersonTotal+i].Direction:=1;
      person[self.CurrentPersonTotal+i].CurrentFloor:=1;
      Person[self.CurrentPersonTotal+i].PersonID:=self.CurrentPersonTotal+i;
      Person[self.CurrentPersonTotal+i].PersonStatus:=PersonStatus_Request;
      Person[self.CurrentPersonTotal+i].Taking_Time:=0;
      Person[self.CurrentPersonTotal+i].idle_Time:=0;
      Person[self.CurrentPersonTotal+i].Request_Time:=0;
      Person[self.CurrentPersonTotal+i].MissionCompleted:=false;
      person[self.CurrentPersonTotal+i].DestinationFloor:=Random(40)+1;
      while person[self.CurrentPersonTotal+i].DestinationFloor<=1 DO
            person[self.CurrentPersonTotal+i].DestinationFloor:=Random(40)+1;

      person[self.CurrentPersonTotal+i].SelectedElavotorID:=
         person[self.CurrentPersonTotal+i].ChooseElavotor(1,
          person[self.CurrentPersonTotal+i].DestinationFloor);

      person[self.CurrentPersonTotal+i].SendRequest(1,
        person[self.CurrentPersonTotal+i].DestinationFloor);
    finally
    end;
     self.CurrentPersonTotal:=iTemp;
end;

procedure TSystemControl.Initsystem;
var i:integer;
begin
  self.SimTimeTotal:=0;
  self.CurrentPersonTotal:=0;
  DelIdle:=Tstringlist.Create;
  systemMonitor:=TsystemMonitor.create(false); //創建系統監控線程
  systemMonitor.Suspend;
  Randomize;
  //初始化電梯對象參數
   try
    for i:=0 to 9 Do
      begin
           Elavotor[i]:=TElavotor.Create;
           Elavotor[i].ID:=i;
           Elavotor[i].Speed :=ElavotorSpeed;
           Elavotor[i].MaxLoadCapacity:=Maxload;
           Elavotor[i].UpDownTime:=UpDownTime;
           Elavotor[i].CurrentLoadCapacity :=0;
           Elavotor[i].Direction:=2;
           Elavotor[i].DestFloorlayer:=0;
           Elavotor[i].OSdelaytime:=1;
           Elavotor[i].CurrentStatus:=0;
           Elavotor[i].CurrentLoadCapacity :=0;
           Elavotor[i].nIdleTime:=0;
           Elavotor_idle_Label[i].Caption :=Inttostr(Elavotor[i].nidleTime);
           Elavotor[i].nBusyTime:=0;
           Elavotor_Busy_Label[i].Caption :=Inttostr(Elavotor[i].nBusyTime);
           Elavotor[i].CurrentFloor:=Random(40)+1;
           ElavotorTrack[i].Position:=1-Elavotor[i].CurrentFloor;
           Elavotor[i].PersonTotal :=0;
           Elavotor[i].OuterRequestArray :=TStringList.Create;
           Elavotor[i].InsideRequestArray :=TStringList.Create;
           RunThread[i]:=TRunThread.Create(false);
           RunThread[i].Suspend;
           RunThread[i].ElavotorID:= i;
      end;
      For i:=1 to 40 Do
         begin
          Floor[i]:=TFloor.Create;
          Floor[i].Requestlist:=TStringList.Create;
          Floor[i].Idlelist:=TStringList.Create;
         end;

   finally
   end;
end;

{ TElavotor }

function TElavotor.CheckStop(CurrentFloor:integer): Boolean;
var i,j,iDown:integer;
    Tempstr,Str:string;
begin
   Result:=false;
   //判斷當前層是否有人下
   if (CurrentFloor>40) or (CurrentFloor<1) then exit;
   iDown:=self.InsideRequestArray.Count-1;
   for i:=0 to iDown Do
     begin
       Tempstr:=self.InsideRequestArray.Strings[i];
       Str:=Copy(Tempstr,0,pos('-',Tempstr)-1);
       j:=Strtoint(Str);
       if Person[j].MissionCompleted then Continue;
       if person[j].DestinationFloor=CurrentFloor then
         begin
           Result:=True;
           Exit;
         end;
     end;
   //判斷是否滿員
   if self.isFull then
     begin
       Result:=false;
       exit;
     end;
   //如果沒有人下,判斷是否有人上
   iDown:=Floor[CurrentFloor].Requestlist.Count-1;
    for i:=0 to iDown Do
      if CurrentFloor<>1 then
        begin
          Tempstr:=Floor[CurrentFloor].Requestlist.Strings[i];
          Str:=Copy(Tempstr,0,pos('-',Tempstr)-1);
          j:=Strtoint(Str);
          if not person[j].MissionCompleted then
          if person[j].CurrentFloor = CurrentFloor then
           begin
             Result:=True;
             Exit;
           end;
        end else if (CurrentFloor=1) or (CurrentFloor=40) then
           begin
             Result:=True;
             Exit;
           end;
end;

procedure TElavotor.CloseDoor(DelayTime: integer);
begin
  self.nidleTime:=self.nidleTime+DelayTime;
  Elavotor_idle_Label[self.ID].Caption :=inttostr(self.nidleTime);
end;

procedure TElavotor.Continuerun;
begin
   if Self.Direction=1 then self.UPrun
      else if Self.Direction=2 then self.Downrun
        else if Self.Direction=0 then
                   begin
                     self.nidleTime:=self.nidleTime+1;
                     Elavotor_idle_Label[self.ID].Caption :=inttostr(self.nidleTime);
                     exit;
                   end;
end;

procedure TElavotor.Downrun;
begin
  if (self.CurrentFloor=1) then
      begin
         self.Direction:=1;
         exit;
      end;
  Self.CurrentFloor:=self.CurrentFloor-ElavotorSpeed;
  if Self.CurrentFloor<=0 then  Self.CurrentFloor:=1;
  ElavotorTrack[self.ID].Position:=1-self.CurrentFloor;
  self.nBusyTime:= self.nBusyTime+1;
  Elavotor_Busy_Label[self.ID].Caption :=inttostr(self.nBusyTime);
  if not CanTake(self.ID,self.CurrentFloor) then exit;  //如果當前樓層不能停,就繼續下
  self.TakeElavotor(self.CurrentFloor);
end;

procedure TElavotor.OpenDoor(DelayTime: integer);
begin
    self.nidleTime:=self.nidleTime+DelayTime;
    Elavotor_idle_Label[self.ID].Caption :=inttostr(self.nidleTime);
end;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美成人猛片aaaaaaa| 日韩精品亚洲专区| 免费成人av在线播放| 国产成人av电影在线观看| 91久久精品一区二区二区| 欧美一级夜夜爽| 亚洲综合一区二区三区| 国内精品免费**视频| 欧美日韩专区在线| 中文字幕亚洲一区二区va在线| 久久精品国产免费看久久精品| 色婷婷av久久久久久久| 中文字幕av一区二区三区免费看| 日韩av在线播放中文字幕| 91女厕偷拍女厕偷拍高清| 久久天堂av综合合色蜜桃网| 婷婷综合另类小说色区| 91久久香蕉国产日韩欧美9色| 欧美韩国日本综合| 国产成人高清在线| 久久精品亚洲精品国产欧美kt∨| 久久不见久久见中文字幕免费| 欧美三级电影在线观看| 一区二区三区丝袜| 91视频观看视频| 亚洲视频一区在线观看| 97国产精品videossex| 国产精品剧情在线亚洲| zzijzzij亚洲日本少妇熟睡| 国产精品天干天干在线综合| 国产成人av一区| 欧美激情一区二区在线| 成人av在线一区二区| 国产精品久久久久久久午夜片| 国产夫妻精品视频| 中文字幕二三区不卡| a美女胸又www黄视频久久| 国产精品国产三级国产aⅴ入口| 成人免费视频一区| 中文字幕一区二区三区乱码在线 | 亚洲午夜私人影院| 在线观看免费一区| 婷婷一区二区三区| 欧美一区二区网站| 国产一区二区在线影院| 中国色在线观看另类| 99re热这里只有精品视频| 亚洲精品成人少妇| 欧美久久一二三四区| 久久国产日韩欧美精品| 久久精品免费在线观看| 成人丝袜18视频在线观看| 亚洲美女视频在线| 欧美丰满嫩嫩电影| 国产精品一区二区三区99| 中文字幕制服丝袜成人av | 一区二区在线观看免费视频播放 | 天天综合色天天| 精品久久五月天| 成人v精品蜜桃久久一区| 亚洲黄色免费网站| 日韩午夜在线观看| 99久久免费精品| 日韩av电影一区| 国产精品久久看| 91精品国产色综合久久ai换脸| 国产一区 二区 三区一级| 亚洲欧美经典视频| 日韩一级完整毛片| 一本一本久久a久久精品综合麻豆| 亚洲一区电影777| 久久九九99视频| 欧美老人xxxx18| 99久久国产综合精品麻豆| 天堂久久久久va久久久久| 国产亚洲一区二区三区四区| 欧美午夜视频网站| 成人深夜福利app| 久久精品二区亚洲w码| 中文字幕一区免费在线观看| 日韩一二三区视频| 在线亚洲一区二区| 国产91精品久久久久久久网曝门 | 亚洲黄色尤物视频| 久久久精品免费网站| 欧美日韩卡一卡二| 成人精品在线视频观看| 老司机精品视频线观看86| 一区二区三区电影在线播| 国产欧美日韩在线| 精品国产亚洲一区二区三区在线观看| 色香蕉成人二区免费| 国产大陆精品国产| 久久精品国产在热久久| 日韩专区一卡二卡| 一区二区不卡在线播放| 国产精品美女久久久久aⅴ| 欧美哺乳videos| 日韩一二三区不卡| 911精品产国品一二三产区| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 亚洲一区二区三区中文字幕| 国产精品白丝在线| 中文字幕av一区二区三区免费看 | 一区二区三区在线观看国产| 亚洲国产电影在线观看| 国产亚洲欧洲997久久综合| 精品国产1区二区| 欧美成人一区二区三区片免费| 欧美一区二区精美| 欧美一区二区在线播放| 在线不卡一区二区| 337p亚洲精品色噜噜狠狠| 欧美日韩亚洲综合在线| 在线精品亚洲一区二区不卡| 色综合久久久久综合体桃花网| 97久久精品人人做人人爽 | 国产精品亚洲专一区二区三区| 精品午夜一区二区三区在线观看| 欧美bbbbb| 国产综合久久久久久久久久久久| 国产一区视频导航| 国产成人啪午夜精品网站男同| 国产精品一二三在| 99精品久久99久久久久| 色噜噜狠狠一区二区三区果冻| 欧美日韩视频在线第一区 | 在线精品视频小说1| 欧美日韩国产综合久久| 欧美精品一二三| 精品精品欲导航| 国产精品视频yy9299一区| 亚洲色图一区二区三区| 亚洲高清在线视频| 久久av中文字幕片| 成人a级免费电影| 欧美揉bbbbb揉bbbbb| 日韩精品一区二区在线观看| 久久久久9999亚洲精品| 亚洲精品福利视频网站| 麻豆精品视频在线观看| 风间由美性色一区二区三区| 一本大道久久精品懂色aⅴ| 欧美精品18+| 国产欧美日韩久久| 一区二区三区在线观看欧美| 捆绑紧缚一区二区三区视频| 成人av在线播放网站| 欧美日免费三级在线| 久久久久国色av免费看影院| 亚洲一区二区五区| 国产福利一区在线| 欧美视频一区二区三区| 国产午夜精品久久久久久久 | 成人午夜视频在线| 欧美三级日韩三级国产三级| 国产欧美一区二区精品仙草咪| 亚洲自拍偷拍欧美| 国产精品影视网| 欧美精品久久久久久久久老牛影院| 精品成人佐山爱一区二区| 亚洲激情第一区| 岛国一区二区三区| 欧美精品久久久久久久多人混战| 欧美激情一区二区三区四区| 日本欧美肥老太交大片| 99re热这里只有精品免费视频| 欧美岛国在线观看| 亚洲成人av中文| 色婷婷综合激情| 国产欧美日韩卡一| 极品尤物av久久免费看| 精品视频999| 亚洲日穴在线视频| 国产成人啪免费观看软件| 欧美日本一道本| 亚洲一区二区影院| 日本韩国精品在线| 国产精品日日摸夜夜摸av| 久久99精品一区二区三区| 欧美男生操女生| 亚洲伊人伊色伊影伊综合网| 99re这里都是精品| 中文字幕av不卡| 国产成人av一区二区三区在线| 欧美大胆人体bbbb| 日韩国产欧美一区二区三区| 在线观看亚洲成人| 亚洲影视在线播放| 欧洲精品在线观看| 亚洲激情成人在线| 91精彩视频在线观看| 亚洲女爱视频在线| 99久久精品国产导航| 亚洲欧美一区二区在线观看| 成人免费福利片| 亚洲色图制服诱惑| 在线看国产一区| 亚洲第一综合色| 欧美精品第一页|