MAIN MODULE bank;
FROM ListMod IMPORT QueueList;
FROM RandMod IMPORT RandomObj;
FROM SimMod IMPORT SimTime, StartSimulation;
TYPE
OkienkoObj= OBJECT; FORWARD;
KolejkaObj= OBJECT(QueueList)
dlugosc: INTEGER;
okienko: OkienkoObj;
ASK METHOD UstawOkienko(IN okno: OkienkoObj);
ASK METHOD UstawDlugosc(IN dl: INTEGER);
OVERRIDE
ASK METHOD Add(IN NewMember : ANYREC);
END OBJECT;
OkienkoObj= OBJECT(RandomObj)
SrCzasObs: REAL;
kolejka: KolejkaObj;
SrCzasWBanku: REAL;
wolne: BOOLEAN;
TELL METHOD ObslugaKlienta;
ASK METHOD UstawSrCzasObs(IN czas: REAL);
ASK METHOD UstawKolejke(IN kol: KolejkaObj);
END OBJECT;
OtoczenieObj= OBJECT(RandomObj)
SrOdstep: REAL;
kolejka: KolejkaObj;
ASK METHOD UstawSrOdstep(IN czas: REAL);
ASK METHOD UstawKolejke(IN kol: KolejkaObj);
TELL METHOD GenerujKlientow;
END OBJECT;
KlientRec= RECORD
CzasWej: REAL;
END RECORD;
OBJECT OkienkoObj;
TELL METHOD ObslugaKlienta;
VAR
klient: KlientRec;
co: REAL;
BEGIN
wolne:=FALSE;
WHILE ASK kolejka numberIn > 0
klient:=ASK kolejka TO Remove;
co:=ASK SELF TO Exponential(SrCzasObs);
WAIT DURATION co
END WAIT;
SrCzasWBanku:=SrCzasWBanku + SimTime - klient.CzasWej;
END WHILE;
wolne:=TRUE;
END METHOD;
ASK METHOD UstawSrCzasObs(IN czas: REAL);
BEGIN
SrCzasObs:=czas;
wolne:=TRUE;
END METHOD;
ASK METHOD UstawKolejke(IN kol: KolejkaObj);
BEGIN
kolejka:=kol;
END METHOD;
END OBJECT;
{------- kolejka--------------------}
OBJECT KolejkaObj;
ASK METHOD UstawOkienko(IN okno: OkienkoObj);
BEGIN
okienko:=okno;
END METHOD;
ASK METHOD UstawDlugosc(IN dl: INTEGER);
BEGIN
dlugosc:=dl;
END METHOD;
ASK METHOD Add(IN NewMember : ANYREC);
BEGIN
IF numberIn < dlugosc
INHERITED Add(NewMember);
IF ASK okienko wolne
TELL okienko TO ObslugaKlienta;
END IF;
ELSE
DISPOSE(NewMember);
END IF;
END METHOD;
END OBJECT;
{---------OtoczenieObj-------------}
OBJECT OtoczenieObj;
ASK METHOD UstawSrOdstep(IN czas: REAL);
BEGIN
SrOdstep:=czas;
END METHOD;
ASK METHOD UstawKolejke(IN kol: KolejkaObj);
BEGIN
kolejka:=kol;
END METHOD;
TELL METHOD GenerujKlientow;
VAR
klient: KlientRec;
odstep: REAL;
BEGIN
WHILE SimTime < 10000.0
odstep:=Exponential(SrOdstep);
WAIT DURATION odstep
END WAIT;
NEW(klient);
klient.CzasWej:=SimTime;
ASK kolejka TO Add(klient);
END WHILE;
END METHOD;
END OBJECT;
VAR
okienko: OkienkoObj;
otoczenie: OtoczenieObj;
kolejka: KolejkaObj;
BEGIN
NEW(okienko);
NEW(otoczenie);
NEW(kolejka);
ASK okienko TO UstawKolejke(kolejka);
ASK okienko TO UstawSrCzasObs(20.0);
ASK otoczenie TO UstawKolejke(kolejka);
ASK otoczenie TO UstawSrOdstep(10.0);
ASK kolejka TO UstawOkienko(okienko);
ASK kolejka TO UstawDlugosc(10);
TELL otoczenie TO GenerujKlientow;
StartSimulation;
DISPOSE(okienko);
DISPOSE(otoczenie);
DISPOSE(kolejka);
END MODULE.