Ada - 任务终止错误 - "预期声明"

时间:2016-04-24 15:23:38

标签: task ada

我有以下任务

   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不起作用?谢谢!

2 个答案:

答案 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