Вы можете использовать «выборочное принятие», чтобы позволить вашей задаче быть прерванной внешним абонентом (другая задача или основная программа).Вы не можете (легко) прервать задачу в произвольный момент ее выполнения;вместо этого сама задача должна определить, когда она будет принимать входные вызовы.
Таким образом, вы, вероятно, захотите заменить вашу последовательность
Put("1");
Put("2");
Put("3");
...
Put("n");
на цикл, который вызывает Put
один раз вкаждая итерация с оператором select
, который выполняется каждый раз.
Вот демонстрационная программа, которую я только что создал.Счетчик увеличивается один раз в секунду (приблизительно).Значение счетчика печатается, если Running
истинно;в противном случае цикл продолжается молча.Основная программа альтернативно вызывает Pause и Resume каждые 3 секунды.
Предложение else
в операторе select
заставляет его продолжить выполнение, если ни одна из записей не была вызвана.
with Ada.Text_IO; use Ada.Text_IO;
procedure T is
task Looper is
entry Pause;
entry Resume;
end Looper;
task body Looper is
Running: Boolean := True;
Count: Integer := 0;
begin
loop
select
accept Pause do
Running := False;
end;
or
accept Resume do
Running := True;
end;
else
null;
end select;
delay 1.0;
if Running then
Put_Line("Running, Count = " & Integer'Image(Count));
end if;
Count := Count + 1;
end loop;
end Looper;
begin -- T
loop
delay 3.0;
Looper.Pause;
delay 3.0;
Looper.Resume;
end loop;
end T;
Там может быть более элегантный подход, чем этот.Прошло много времени с тех пор, как я действительно использовал Аду.