我创建了已定义的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,不可见,忽略将来的引用
我正在寻找一个能够将命令/集合管道传递给已经实例化的其他任务的任务。
非常感谢任何帮助。
答案 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
,那么你应该很好。