Advertisement
Sylv3rWolf

Untitled

Nov 20th, 2016
370
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 2.40 KB | None | 0 0
  1. with Text_Io;
  2. use  Text_Io;
  3.  
  4. procedure czytelnicy_i_pisarze is
  5.  
  6.   Dane : integer;
  7.  
  8.   protected type Kontroler is
  9.     entry Poczatek_Czytania;
  10.     procedure Koniec_Czytania;
  11.     entry Poczatek_Pisania;
  12.     procedure Koniec_Pisania;
  13.   private
  14.     Akt_Czytelnicy : integer := 0;
  15.     Czy_Pisze : boolean := false;
  16.   end Kontroler;
  17.  
  18.   protected body Kontroler is
  19.     entry Poczatek_Czytania when not Czy_Pisze is
  20.     begin
  21.       Akt_Czytelnicy := Akt_Czytelnicy + 1;
  22.     end Poczatek_Czytania;
  23.  
  24.     procedure Koniec_Czytania is
  25.     begin
  26.       Akt_Czytelnicy := Akt_Czytelnicy - 1;
  27.     end Koniec_Czytania;
  28.  
  29.     entry Poczatek_Pisania when (Akt_Czytelnicy = 0) and (not Czy_Pisze) is
  30.     begin
  31.       Czy_Pisze := true;
  32.     end Poczatek_Pisania;
  33.  
  34.     procedure Koniec_Pisania is
  35.     begin
  36.       Czy_Pisze := false;
  37.     end Koniec_Pisania;
  38.  
  39.   end Kontroler;
  40.  
  41.  
  42.   Data_Kontroler : Kontroler;
  43.  
  44.   task type Typ_Czytelnika is
  45.     entry Start (Index : in integer);
  46.   end Typ_Czytelnika;
  47.  
  48.   task body Typ_Czytelnika is
  49.     MojIndex : integer;
  50.     Czytana_wartosc : integer;
  51.   begin
  52.     accept Start (Index : in integer) do
  53.       MojIndex := Index;
  54.     end Start;
  55.     loop
  56.  
  57.       Delay (Duration (MojIndex));
  58.       Data_Kontroler.Poczatek_Czytania;
  59.       Czytana_wartosc := Dane;
  60.          Put_Line ("Czytelnik: " & MojIndex'img & " wartosc: " & Czytana_wartosc'img);
  61.       Data_Kontroler.Koniec_Czytania;
  62.  
  63.     end loop;
  64.   end Typ_Czytelnika;
  65.  
  66.   task type Typ_Pisarza is
  67.     entry Start;
  68.   end Typ_Pisarza;
  69.  
  70.   task body Typ_Pisarza is
  71.     Pisana_wartosc : integer := 0;
  72.   begin
  73.  
  74.     accept Start do
  75.       Data_Kontroler.Poczatek_Pisania;
  76.       Dane := Pisana_wartosc;
  77.       Put_Line ("Pisana wartosc: " & Pisana_wartosc'img);
  78.       Data_Kontroler.Koniec_Pisania;
  79.     end Start;
  80.  
  81.     loop
  82.       Delay (10.0);
  83.       Pisana_wartosc := Pisana_wartosc + 1;
  84.       Data_Kontroler.Poczatek_Pisania;
  85.       Dane := Pisana_wartosc;
  86.       Put_Line ("Pisana wartosc: " & Pisana_wartosc'img);
  87.       Data_Kontroler.Koniec_Pisania;
  88.  
  89.     end loop;
  90.   end Typ_Pisarza;
  91.  
  92.   Liczba_czytelnikow : constant := 4;
  93.   type Tablica_czytelnikow is array (1..Liczba_czytelnikow) of Typ_Czytelnika;
  94.   Czytelnicy : Tablica_czytelnikow;
  95.   Pisarz : Typ_Pisarza;
  96.  
  97. begin
  98.  
  99.   Pisarz.Start;
  100.   for Index in 1..Liczba_czytelnikow loop
  101.     Czytelnicy(Index).Start(Index);
  102.   end loop;
  103.  
  104. end czytelnicy_i_pisarze;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement