Ada, taski i synchronizacja

0

Chciałbym równolegle wyświetlać w dwóch kolumnach ciągi znaków.
Wykorzystuje do tego taski z języka Ada.
Niestety finalnie nie wygląda to tak jakbym chciał, przy wyświetlaniu powstają wolne linie, wszystko się miesza.
W jaki sposób zsynchronizować te dwa taski?

with Ada.Text_IO;
use Ada.Text_IO;

with Ada.Integer_Text_IO;
use Ada.Integer_Text_IO;

with RandomPackage;
use RandomPackage;


procedure Main is
   task zadanie_1;
   task zadanie_2;
   task body zadanie_1 is
      czas,czas_max,i : Integer;
      D : Duration;
   begin
      czas_max := 10;
      i := 1;
      loop
      czas:= RandomInt(czas_max);
      D := Duration(Float(czas)/10.0);
      Set_Line(Positive_Count(i+2));
      Put("Zadanie 1 po raz ");    
         Put(i,1);
         Put(" Opoznienie: ");
         Put(czas,2);
      delay D;         
      exit when i=10;
      i := i + 1;
               end loop;
   end zadanie_1;
    task body zadanie_2 is
      czas,czas_max,i : Integer;
      D : Duration;
   begin
      czas_max := 10;
      i := 1;
      loop
      czas:= RandomInt(czas_max);
      D := Duration(Float(czas)/10.0);
      Set_Line(Positive_Count(i+1));
      Set_Col(15);
      Put("Zadanie 2 po raz ");    
         Put(i,1);
         Put(" Opoznienie: ");
         Put(czas,2);
      delay D;         
      exit when i=10;
      i := i + 1;
               end loop;
               end zadanie_2;  
   
  
begin
   null;
end Main;



0

Ada chyba nie ma tu nic do rzeczy... Po prostu będzie ciężko to osiągnąć z powodów terminalowych. Chcesz -- jeśli dobrze rozumiem -- żeby jeden proces pisał w jednej kolumnie, a drugi w drugiej w terminalu?

0

Dokładnie, chciałbym żeby jeden proces wypisywał komunikat w jednej a drugi w drugiej

2

Więc -- chyba by wypadało, żeby robić jakiś semafor (trochę dawno robiłem w Adzie i nie pamiętam jaki jest tam odpowiednik) i go opuszczać przed Set_Line a podnosić po ostatnim Put -- tak, żeby cały wydruk był atomowy...

Poza tym nie masz w zadaniu 1 Set_Col...

Spróbuj zresztą może najpierw prostszy kod -- na przykład tak, żeby tylko jedno zadanie wyświetlało jedynki a drugie dwójki w losowych odstępach czasu, ale w miejscu, które chcesz...

0

@user-SEC: Jak Ci wyjdzie, to pokaż kod... Jak nie, to też. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1