Ada选择多个条目

时间:2017-09-07 15:56:50

标签: task ada

我正在寻找一种选择多个条目的方法。我已完成以下任务并选择阻止。目的是在其他地方运行多个(2)任务,运行直到一个完成,或在一段时间后超时

task type t_startup_task is
   entry start;
   entry started;
end t_startup_task;

task body t_startup_task is
   startup_sig : Boolean := False;
begin
   accept start;
   busy : loop -- wait for external flag to become true
      status.read_signal (startup_sig);
      if startup_sig then
         exit busy;
      end if;
      delay 0.1;
   end loop busy;
   accept started;
end t_startup_task;

<...>

startup_task.start;
select
   startup_task.started;
or
   state.wait_done; -- other entry
   abort startup_task;
   return False;
or
   delay 4.0;
end select;

但是,这会导致以下编译错误:

only allowed alternative in timed entry call is delay
"or" not allowed here

实际执行此操作的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

很遗憾,您无法使用pandas.DataFrame语句来决定多个条目调用。但是,您可以使用它们来决定接受条目,因此具有三个任务的实现应该有效。

您仍然可以通过在最终通话中使用输出参数获得返回值。

select

注意,我没有测试或编译过这段代码,但它应该给出一个解决方案的想法。

答案 1 :(得分:0)

从技术上讲,语言允许这样:

select
   delay 4.0;
   ...
then abort
   select
      Entry1;
      ...
   then abort
      Entry2;
      ...
   end select;
end select;

可能会做你想要的。但是,最好的方法可能是使用受保护对象检入任务,并等待PO的条目:

protected Multi_Wait is
   procedure Task1_Ready;
   procedure Task2_Ready;
   entry Wait_For_Either (Task_1 : out Boolean; Task_2 : out Boolean);
private -- Multi_Wait
   Task1 : Boolean := False;
   Task2 : Boolean := False;
end Multi_Wait;

然后你的代码就可以了

select
   Multi_Wait.Wait_For_Either (Task_1 => Task_1, Task_2 => Task_2);

   if not Task_1 and Task_2 then
      abort T1;

      return False;
   end if;
or
   delay 4.0;
end select;

您的任务会调用相应的过程,而不是等待第二次来电。