Ada 95任务:如何将一个实例化任务的集合发送到另一个实例化任务中的另一个任务?

时间:2015-07-28 09:47:09

标签: task scheduled-tasks ada

我创建了已定义的2个任务类型,并在主程序中实例化它们。

如何在单独的任务之间发送集合?

Procedure Task_Prog is
    task type Task_one is
        entry Redezvous_One;
    end Task_one;

    task type Task_Two is
        entry Redezvous_Two;
    end Task_Two;

    task body Task_one is
        Finished : Boolean := False;
    begin
        while not Finished loop
            accept Redezvous_One do
                finished := True;
                Task_Instantiation_B.Redezvous_Two;
            end Redezvous_One;
        end loop;
    end Task_one;

    task body Task_Two is
        Finished : Boolean := False;
    begin
        while not Finished loop
            accept Redezvous_Two do 
                finished := True;
            end Redezvous_Two;
        end loop;
    end Task_Two;

    Task_Instantiation_A : Task_one;
    Task_Instantiation_B: Task_Two;
begin
    Task_Instantiation_A.Redezvous_One;
end Task_Prog;

编译错误是:

  

task_prog.ada:错误:第17行第4列LRM:4.1(3),直接名称,Task_Instantiation_B,不可见,忽略将来的引用

我正在寻找一个能够将命令/集合管道传递给已经实例化的其他任务的任务。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:6)

只需在任务主体声明上方移动任务实例就可以使它们对任务主体可见,并且通过此更改,您的示例将成功编译。

那是......

Procedure Task_Prog is
   task type Task_one is
       entry Rendezvous_One;
   end Task_one;

   task type Task_Two is
       entry Rendezvous_Two;
   end Task_Two;

   Task_Instantiation_A : Task_one;
   Task_Instantiation_B : Task_Two;

   task body Task_one is
   ... etc

这可能与您的大问题无法兼容。如果没有,则在问题中添加更多细节或约束。

答案 1 :(得分:0)

首先,您需要意识到Accept / do ... end中的所有内容都是集合点,因此在Task_Instantiation_B.Redezvous_Two内调用Redezvous_One是可能会陷入僵局。 (鉴于它是一种任务类型,您可以执行与Redezvous_One中调用的任务不同的任务,这将解决该问题。)

所以,改变一下:

    while not Finished loop
        accept Redezvous_One do
            finished := True;
            Task_Instantiation_B.Redezvous_Two;
        end Redezvous_One;
    end loop;

到此:

    while not Finished loop
        accept Redezvous_One do
            finished := True;
        end Redezvous_One;
    end loop;
    Task_Instantiation_B.Redezvous_Two;

其次,您需要重新排序任务规范和正文:

Task type Task_one is --...
Task type Task_two is --...

Task body Task_one is --...
Task body Task_two is --...

应该这样做。 - 现在,如果你不会有倍数,将task type改为普通task,那么你应该很好。