我有以下任务
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;
我们代表一个指示灯和一些带有任务和保护的汽车(汽车〜汽车)。我的主要问题是,我不知道如何终止,以防指标接受auto的输入。您可以看到我当前正在尝试做的事情,并且会弹出错误(请参阅内联)。一旦条目被接受,我该如何停止任务?为什么terminate
不起作用?谢谢!
答案 0 :(得分:4)
terminate
不是您执行的“操作”。也就是说,您无法在任务正文中选择的任何位置使用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
语句的“某些”代码永远不会退出循环,则任务永远不会终止。这意味着封闭任务的其他构造永远不会终止。例如:
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
永远不会返回,程序可能会死锁。
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
已到达其代码的末尾,然后我们终止任务。任务组退出,完成任何需要完成的完成,然后Proc
即可完成。
or terminate
只能用于“选择性接受”。如果您说select Some_Other_Task.Entry_2(...);
以阻止其他任务的条目可用,则您无法在or terminate
这种select
中使用end
。
在更复杂的情况下,过程可以创建两个或更多任务。当该过程到达其select
语句时,它将不会返回(粗略地说)它创建的所有任务都已完成或所有未完成的任务都被阻止在{ {1}}包含or terminate
个子句的语句。如果后者发生,则所有这些任务都完成,然后程序可以返回。
关于“终止替代方案”的规则在RM 9.3(6)中。它讲的是取决于主人;在上面显示的示例中,Proc
是主人。
答案 1 :(得分:2)
如果我正确理解了您的问题,exit
可以很好地代替terminate
。