A feladat a következő: Imi 5-öst kapott Adából és ezt el akarja mondani telefonon egyik ismerősének. Az elésővel kezdi, fehívja és vár egy kicsit, hogy ő felvegye. Ha nem veszi fel az első ismerőse, akkor hívja a másodikat és így tovább. (Most 3 ismerőse van.) Az ismerősök pedig úgy működnek, hogy bemennek a szobájukba, ha épp csörög a telefpn felveszik, ha nem, akkor egy időre elhagyják a szobát. (Ilyenkor nem hallják a csörgést.) Szimuláljuk ezt az esetet addig amíg Iminek sikerül valakivel beszélnie.
with ada.text_io, ada.numerics.discrete_random;
use ada.text_io;
procedure telefon is
subtype int is integer range 1..3;
package irand is new ada.numerics.discrete_random(int);
use irand;
type ismeros_tipus is (Kati, Jani, Sanyi);
task type ismeros(ism : ismeros_tipus) is
entry hiv;
end ismeros;
task Imi;
A sim taszk mondja meg, hogy tart-e még a szimuláció. Ezt később védett objektumokkal szebben meg tudjuk oldani
task sim is
entry vege(b : out boolean);
entry legyen_vege;
end sim;
task body sim is
bb : boolean := false;
begin
loop
select
accept vege(b : out boolean) do
b := bb;
end vege;
or
accept legyen_vege do
bb := true;
end legyen_vege;
or
terminate;
end select;
end loop;
end sim;
task body ismeros is
b : boolean;
g : generator;
begin
reset(g);
delay duration(random(g));
sim.vege(b);
while not b loop
select
accept hiv do
put_line(ismeros_tipus'image(ism) & ": sikerult velem beszelni");
sim.legyen_vege;
end hiv;
else
put_line(ismeros_tipus'image(ism) & ": nem volt dumcsi");
delay duration(random(g));
end select;
sim.vege(b);
end loop;
end ismeros;
i1 : ismeros(Kati);
i2 : ismeros(Jani);
i3 : ismeros(Sanyi);
task body Imi is
b : boolean := false;
begin
while not b loop
select
i1.hiv;
exit;
or
delay 1.0;
put_line("Nem sikerult Katival beszelnem");
end select;
select
i2.hiv;
exit;
or
delay 1.0;
put_line("Nem sikerult Janival beszelnem");
end select;
select
i3.hiv;
exit;
or
delay 1.0;
put_line("Nem sikerult Sanyival beszelnem");
end select;
end loop;
end Imi;
begin
null;
end telefon;
VISSZA