Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- WITH Ada.Text_IO, Ada.Numerics.Discrete_Random, fifo, lib_ksiazka;
- USE Ada.Text_IO, lib_ksiazka;
- PROCEDURE Biblioteka IS
- -----------------Globalne------------------
- Is_Opened: Boolean := True;
- TYPE Hours_Type IS RANGE 0..23;
- TYPE Minutes_Type IS RANGE 0..59;
- Minute_Duration: CONSTANT Duration := 0.01;
- Open_Hour: CONSTANT Hours_Type := 8;
- Close_Hour: CONSTANT Hours_Type := 17;
- Hours: Hours_Type :=6;
- Minutes: Minutes_Type := 0;
- --------------- Losowanie ksiazki----------
- PACKAGE Losuj_Ksiazke IS NEW Ada.Numerics.Discrete_Random(Ksiazka);
- USE Losuj_Ksiazke;
- Gen: Generator;
- ----------------Klient-----------------
- TASK TYPE Klient IS
- Entry Start(K: Ksiazka);
- END Klient;
- TYPE Klient_Wskaznik IS ACCESS Klient;
- TASK BODY Klient IS
- K: Ksiazka := Brak;
- Do_Zwrotu: Boolean := false;
- BEGIN
- ACCEPT Start(K: Ksiazka);
- END Klient;
- --------------Bibliotekarz--------------
- TASK TYPE Bibliotekarz IS
- ENTRY Ustaw_Klienta(klient: Klient_Wskaznik);
- ENTRY Wypozycz(K:Ksiazka);
- ENTRY Zwroc(K: Ksiazka);
- END Bibliotekarz;
- TYPE Bibliotekarz_Wskaznik IS ACCESS Bibliotekarz;
- TASK BODY Bibliotekarz IS
- Wk: Klient_Wskaznik:=NULL;
- Ja: Bibliotekarz_Wskaznik:=NULL;
- BEGIN
- LOOP
- SELECT
- WHEN (wk=NULL AND is_Opened)=>
- --kolejka.GetKlient
- ACCEPT Ustaw_Klienta(Klient: Klient_Wskaznik) DO
- Wk := Klient;
- END Ustaw_Klienta;
- --wk.obsluz;
- OR
- WHEN Wk /= NULL =>
- ACCEPT Wypozycz(K: Ksiazka) DO
- Wk:=NULL;
- END Wypozycz;
- OR
- WHEN Wk/= NULL =>
- ACCEPT Zwroc(K: Ksiazka) DO
- Wk:=NULL;
- END Zwroc;
- END SELECT;
- END LOOP;
- END Bibliotekarz;
- ---------------Funkcja-----------------
- FUNCTION Set_Is_Opened RETURN Boolean IS BEGIN
- IF (Hours >= Open_Hour AND Hours < Close_Hour) THEN
- Return True;
- ELSE
- Return False;
- END IF;
- END Set_Is_Opened;
- --------------Czasomierz--------------
- TASK TYPE Czasomierz;
- TASK BODY Czasomierz IS
- BEGIN
- WHILE True LOOP
- IF(Minutes = Minutes_Type'Last) THEN
- Minutes :=0;
- IF(Hours = Hours_Type'Last) THEN
- Hours:=0;
- ELSE
- Hours := Hours + 1;
- END IF;
- ELSE
- Minutes := Minutes + 1;
- END IF;
- Is_Opened :=Set_Is_Opened;
- DELAY Minute_Duration;
- --Put_Line("station time: " & Hours'Img & ":" & Minutes'Img);
- END LOOP;
- END Czasomierz;
- --------------Kolejka-----------
- package Kolejka_Klientow is new Fifo(Klient_Wskaznik);
- USE Kolejka_Klientow;
- TASK TYPE Kolejka IS
- ENTRY Dodaj_Klienta(kw: Klient_Wskaznik);
- ENTRY Pobierz_Klienta(bw: Bibliotekarz_Wskaznik);
- END;
- TASK BODY Kolejka IS
- My_Fifo : Fifo_Type;
- Klient_Do_Obslugi: Klient_Wskaznik;
- BEGIN
- LOOP
- SELECT
- ACCEPT Dodaj_Klienta(kw: Klient_Wskaznik) DO
- Push(My_Fifo, Kw);
- END Dodaj_Klienta;
- OR
- ACCEPT Pobierz_Klienta(bw: Bibliotekarz_Wskaznik) DO
- IF(Is_Empty(MY_Fifo)) THEN
- Put_Line("pusta kolejka");
- Bw.ustaw_Klienta(null);
- ELSE
- Pop(My_Fifo, Klient_Do_Obslugi);
- Bw.ustaw_Klienta(Klient_Do_Obslugi);
- END IF;
- END Pobierz_Klienta;
- END SELECT;
- END LOOP;
- END Kolejka;
- kolejkaKlientow: Kolejka;
- ------------GeneratorKlientów-------------
- TASK TYPE Generator_Klientow IS
- Entry Dodaj_Do_Kolejki;
- END Generator_Klientow;
- TASK BODY Generator_Klientow IS
- Wsk: Klient_Wskaznik;
- BEGIN
- LOOP
- SELECT
- WHEN Is_Opened =>
- ACCEPT Dodaj_Do_Kolejki DO
- Put_Line("Dodaje do kolejki");
- Wsk := NEW Klient;
- kolejkaKlientow.Dodaj_Klienta(Wsk);
- END Dodaj_Do_Kolejki;
- OR WHEN Is_Opened =>
- DELAY 0.1;
- Put_Line("Dodaje do kolejki");
- OR
- delay 0.1;
- END SELECT;
- END LOOP;
- END Generator_Klientow;
- Cz: Czasomierz;
- T: Rekord_Ksiazki;
- S: Baza_Ksiazek(1..1);
- Klient1: Klient_Wskaznik;
- Generator: Generator_Klientow;
- BEGIN
- Reset(Gen);
- Klient1 := NEW Klient;
- END Biblioteka;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement