Ada - 任务终止错误 - "Statement expected"
Ada - Task termination error - "Statement expected"
我有以下任务
task body auto is
begin
Put_Line( licencepalte.all & " set off.");
delay traveltime.all;
Put_Line( licencepalte.all & " arrived.");
loop
select
indicator.passthrough;
terminate; -- error for this line: 'statement expected'
or
delay 0.2;
Put_Line( licencepalte.all & " is waiting.");
end select;
end loop;
end auto;
这里我们代表一个指示灯和一些有任务和受保护的汽车(汽车~汽车)。我的主要问题是,我不知道如何终止,以防指示器接受自动输入。你可以看到我目前正在尝试做什么,它会弹出一个错误(见内联)。条目被接受后如何停止任务?为什么这个 terminate
不起作用?谢谢!
如果我对你的问题的理解正确,exit
比 terminate
更好。
terminate
不是您执行的 "action"。也就是说,您不能在任务主体中选择的任何位置使用 terminate
语句来终止任务。终止任务的方法是执行到结束主体的end
;在您的情况下, exit
退出循环有效,就像雅各布的回答一样。
or terminate
的目的是告诉程序任务可以终止(我不知道是否有更好的技术术语)。假设您的任务如下所示:
task body Task_Type_1 is
begin
loop
select
accept Entry_1(...parameters...) do
-- something
end Entry_1;
or
accept Entry_2(...parameters...) do
-- something
end Entry_2;
end select;
end loop;
end Task_Type_1;
如果 accept
语句的 "something" 代码永远不会退出循环,则任务永远不会终止。这意味着包含任务的其他构造永远不会终止。例如:
procedure Proc is
T1 : Task_Type_1;
begin
-- do some stuff
-- now we're at the end, and we have to wait for T1 to complete
end Proc;
该过程创建类型为 Task_Type_1
的任务并启动它。然后执行程序的主体。当达到 end Proc;
时,该过程不会立即终止,因为它必须等到任务完成其工作。但是按照任务的编写方式,任务永远不会完成。因此 Proc
永远不会 return,并且程序可能会死锁。
or terminate
表示任务可以终止:
task body Task_Type_1 is
begin
loop
select
accept Entry_1(...parameters...) do
-- something
end Entry_1;
or
accept Entry_2(...parameters...) do
-- something
end Entry_2;
or
terminate;
end select;
end loop;
end Task_Type_1;
在这个小例子中,我们有一个只创建这个任务的过程,or terminate
意味着:如果这个任务到达一个点,它在select
因为没有任何入口调用在等待, 和 如果 Proc
已到达其代码的末尾, 则 我们终止任务。任务体退出,所有需要做的finalization都完成了,然后Proc
就可以完成了。
or terminate
只能在 "selective accept" 中使用。如果你说 select Some_Other_Task.Entry_2(...);
以便它阻塞直到另一个任务的条目可用,你不能在那种 select
.
中使用 or terminate
在更复杂的情况下,一个过程可以创建两个或多个任务。当该过程到达其 end
语句时,它不会 return 直到(粗略地说)它创建的所有任务都已完成 或 所有尚未完成的任务'completed 在 select
具有 or terminate
子句的语句上被阻止。如果发生后者,则所有这些任务都完成,然后该过程可以 return.
关于"terminate alternatives"的规则在RM 9.3(6)中。讲的是依赖师父;在我上面显示的例子中,Proc
是主人。
我有以下任务
task body auto is
begin
Put_Line( licencepalte.all & " set off.");
delay traveltime.all;
Put_Line( licencepalte.all & " arrived.");
loop
select
indicator.passthrough;
terminate; -- error for this line: 'statement expected'
or
delay 0.2;
Put_Line( licencepalte.all & " is waiting.");
end select;
end loop;
end auto;
这里我们代表一个指示灯和一些有任务和受保护的汽车(汽车~汽车)。我的主要问题是,我不知道如何终止,以防指示器接受自动输入。你可以看到我目前正在尝试做什么,它会弹出一个错误(见内联)。条目被接受后如何停止任务?为什么这个 terminate
不起作用?谢谢!
如果我对你的问题的理解正确,exit
比 terminate
更好。
terminate
不是您执行的 "action"。也就是说,您不能在任务主体中选择的任何位置使用 terminate
语句来终止任务。终止任务的方法是执行到结束主体的end
;在您的情况下, exit
退出循环有效,就像雅各布的回答一样。
or terminate
的目的是告诉程序任务可以终止(我不知道是否有更好的技术术语)。假设您的任务如下所示:
task body Task_Type_1 is
begin
loop
select
accept Entry_1(...parameters...) do
-- something
end Entry_1;
or
accept Entry_2(...parameters...) do
-- something
end Entry_2;
end select;
end loop;
end Task_Type_1;
如果 accept
语句的 "something" 代码永远不会退出循环,则任务永远不会终止。这意味着包含任务的其他构造永远不会终止。例如:
procedure Proc is
T1 : Task_Type_1;
begin
-- do some stuff
-- now we're at the end, and we have to wait for T1 to complete
end Proc;
该过程创建类型为 Task_Type_1
的任务并启动它。然后执行程序的主体。当达到 end Proc;
时,该过程不会立即终止,因为它必须等到任务完成其工作。但是按照任务的编写方式,任务永远不会完成。因此 Proc
永远不会 return,并且程序可能会死锁。
or terminate
表示任务可以终止:
task body Task_Type_1 is
begin
loop
select
accept Entry_1(...parameters...) do
-- something
end Entry_1;
or
accept Entry_2(...parameters...) do
-- something
end Entry_2;
or
terminate;
end select;
end loop;
end Task_Type_1;
在这个小例子中,我们有一个只创建这个任务的过程,or terminate
意味着:如果这个任务到达一个点,它在select
因为没有任何入口调用在等待, 和 如果 Proc
已到达其代码的末尾, 则 我们终止任务。任务体退出,所有需要做的finalization都完成了,然后Proc
就可以完成了。
or terminate
只能在 "selective accept" 中使用。如果你说 select Some_Other_Task.Entry_2(...);
以便它阻塞直到另一个任务的条目可用,你不能在那种 select
.
or terminate
在更复杂的情况下,一个过程可以创建两个或多个任务。当该过程到达其 end
语句时,它不会 return 直到(粗略地说)它创建的所有任务都已完成 或 所有尚未完成的任务'completed 在 select
具有 or terminate
子句的语句上被阻止。如果发生后者,则所有这些任务都完成,然后该过程可以 return.
关于"terminate alternatives"的规则在RM 9.3(6)中。讲的是依赖师父;在我上面显示的例子中,Proc
是主人。