?? define.pas
字號:
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 + -