task 和子程序有点相关,因为当主体完成时,构造结束,也就是说,构造以适当的end 结束;在procedure 的情况下,控制返回给调用者,在function 的情况下引发异常PROGRAM_ERROR,在task 的情况下,控制“线程”终止。
您的特定问题发生的情况似乎可以归结为以下几点:
Package Example is
Task Type Message_Task is
Entry Execute;
End Message_Task;
End Example;
Package Body Example is
Task Body Message_Task is
Use Ada.Text_IO;
Begin
accept Execute do
Put_Line( "Rendezvous!" );
end Execute;
delay 0.2; -- Stub delay.
Put_Line( "Finishing Task." );
-- Task Ends Here.
End Message_Task;
End Example;
--...
Test : Example.Message_Task;
--...
Test.Execute;
-- Test.Execute can't be accepted here because it can only accept "Execute"
-- the one time, as per the body's definition.
这真的像你的问题的原因是,同样,一旦你说“X.Start(1,2)”,另一个对Start的调用不会重置位置任务的执行备份到那个接受。
如果您希望任务“保持活动状态”以进行进一步处理,您可以执行以下两个选项之一。
选项 1 -- 设置“协议”:
Package Example is
Task Type Message_Task is
Entry Initialization;
Entry Execute;
Entry Quit;
End Message_Task;
End Example;
Package Body Example is
Task Body Message_Task is
Use Ada.Text_IO;
Has_quit : Boolean := False;
Begin
Main:
loop
select
accept Initialization do
null;
end Initialization;
accept Execute do
null;
end Execute;
or
accept Quit do
Has_Quit := True;
end Quit;
end select;
Exit Main when Has_Quit;
end loop Main;
End Message_Task;
End Example;
选项 2 -- 允许终止。
Package Example is
Task Type Message_Task is
Entry Initialization;
Entry Execute;
End Message_Task;
End Example;
Package Body Example is
Task Body Message_Task is
Use Ada.Text_IO;
Has_quit : Boolean := False;
Begin
accept Initialization do
null;
end Initialization;
Main:
loop
select
accept Execute do
null;
end Execute;
or
terminate;
end select;
end loop Main;
End Message_Task;
End Example;
细微的区别是选项 2 去掉了 Quit 条目,允许任务在 terminate 替代项上“休息”,而选项 1 的控制更明确(在某些情况下是必需的),但要求Initialization & Execute 成对调用。