Есть две тривиальные программы:
Программа1:
with Ada.Text_IO; use Ada.Text_IO;
procedure Main is
task Task1 is
entry Stop;
end Task1;
task body Task1 is
begin
accept Stop;
end Task1;
begin
Put_Line ( "Please wait..." );
Delay 3.0;
abort Task1;
Put_Line ( "Task Task1 Aborted!" );
end main;
Всё прекрасно работает. После запуска проходит 3 секунды, !Программа! завершает свою работу.
Программа2:
with Ada.Text_IO; use Ada.Text_IO;
procedure Main is
task Task1;
task body Task1 is
begin
loop
null;
end loop;
end Task1;
begin
Put_Line ( "Please wait..." );
Delay 3.0;
abort Task1;
Put_Line ( "Task Task1 Aborted!" );
end main;
Проходит 3 секунды. Выдаётся сообщение Task Task1 Aborted и !Программа! продолжает "работать" пока не нажму Ctrl+C.
Система:
CentOS4.3 ( клон RHEL4U3 )
GNAT 3.4.5 ( Red Hat 3.4.5-2 )
GCC 3.4.5 ( Red Hat 3.4.5-2 )
В чём может быть дело? По идее обе программы должны штатно завершаться...
А что нибудь поконкретнее чем null в цикл прописать не пробовали ?
KsiCom wrote:
Dmitriy Anisimkov wrote:
А что нибудь поконкретнее чем null в цикл прописать не пробовали ?
Похоже, именно тут собака и порылась. Поскольку уже вот такое вот
успешно завершается:
with Ada.Text_IO; use Ada.Text_IO;
procedure Main2 is
task Task1;
task body Task1 is
begin
loop
Put_Line ("task1 - working...");
end loop;
end Task1;
begin
Put_Line ( "Please wait..." );
Delay 3.0;
abort Task1;
Put_Line ( "Task Task1 Aborted!" );
end main2;
KsiCom wrote:
В чём может быть дело? По идее обе программы должны штатно завершаться...
Именно так. И поэтому имеет смысл отправить жалобу разработчикам.
Именно так. И поэтому имеет смысл отправить жалобу разработчикам.
У меня похожая проблема была с примерно таким кодом
task body Task1 is
begin
loop
delay 5.0;
Do_Somesing;
end loop;
end Task1;
и вырубить такую задачу когда она была в спячке было тоже
проблематично, видимо пока задача "варится в собственном соку" без
каких бы то нибыло действий "наружу" вырубать ее неполучается,
почемуто.
Andry Ogorodnik wrote:
>Именно так. И поэтому имеет смысл отправить жалобу разработчикам.
>У меня похожая проблема была с примерно таким кодом
task body Task1 is
begin
loop
delay 5.0;
Do_Somesing;
end loop;
end Task1;
>и вырубить такую задачу когда она была в спячке было тоже
>проблематично, видимо пока задача "варится в собственном соку" без >каких бы то нибыло действий "наружу" вырубать ее неполучается,
>почемуто.
Если эта проблема была не в виндах, то это проблема, а если в виндах, надо пробовать компилировать с ключом -gnatP
см. пример http://www.ada-ru.org/smpl-astr.html
On Wed, Jul 12, 2006 at 11:29:28AM +0400, Sergey I. Rybin wrote:
KsiCom wrote:
В чём может быть дело? По идее обе программы должны штатно завершаться...
Именно так. И поэтому имеет смысл отправить жалобу разработчикам.
Странно, я думал RM этого не требует. Что задача может НЕ завершаться пока не достигнет следующей abort completion points:
However, the execution of the aborted construct completes no later than its next abort completion point (if any) that occurs outside of an abort-deferred operation; the following are abort completion points for an execution:
16
* the point where the execution initiates the activation of another * task;
17
* the end of the activation of a task;
18
* the start or end of the execution of an entry call,
* accept_statement, delay_statement, or abort_statement;
19
* the start of the execution of a select_statement, or of the * sequence_of_statements of an exception_handler.
--
Maxim Reznik
Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти