我在阿达有一个关于任务的问题。我想在Ada中做一个服务器,一次为多个客户端服务(使用GNAT.Sockets
)。
是否可以动态创建任务(传递参数)而不是等到此任务完成?我必须使用外部库吗?我真的卡住了。谢谢你的帮助。
答案 0 :(得分:1)
关键在于您的问题,"是否可以动态创建任务[...]“。
如果创建任务类型,则可以使用new
创建该类型的实例,并在分配完成后立即开始运行。
至少有两种传递参数的方法。您可以约束任务类型(下面示例中为A
),也可以将值传递给Start
条目(B
下方)。如果你还需要Start
条目(以确保任务在你准备好之前没有真正开始),或者参数是不能作为约束的东西(例如,记录)那么可能是要走的路:否则没有太多选择。
with Ada.Text_IO; use Ada.Text_IO;
procedure Unnamed454 is
task type A (Param : Integer) is
end A;
type A_P is access A;
task body A is
begin
Put_Line ("task A running with Param:" & Integer'Image (Param));
delay 2.0;
Put_Line ("exiting task A");
end A;
task type B is
entry Start (Param : Integer);
end B;
type B_P is access B;
task body B is
Param : Integer := 0;
begin
accept Start (Param : Integer) do
B.Param := Param;
end Start;
Put_Line ("task B running with Param:" & Integer'Image (Param));
delay 4.0;
Put_Line ("exiting task B");
end B;
begin
Create_A:
declare
The_A : A_P := new A (42);
begin
Put_Line ("in Create_A block");
end Create_A;
Create_B:
declare
The_B : B_P := new B;
begin
Put_Line ("in Create_B block");
The_B.Start (79);
Put_Line ("exiting Create_B block");
end Create_B;
Put_Line ("exiting main");
end Unnamed454;
结果
task A running with Param: 42
in Create_A block
in Create_B block
task B running with Param: 79
exiting Create_B block
exiting main
然后2秒后
exiting task A
然后又过了2秒
exiting task B