有没有办法在后台运行 Ada 任务?
封装体主要是 任务类型Background为结束Background; 任务主体背景是 开始 环形 延迟1.0; 做东西; 结束循环; 结束背景; 程序启用是 B_TASK:后台; 开始 --请不要在这里等待.. 无效的; 结束启用; 主要结束;
您还没有描述“背景”的含义。
这是一个简单的 Ada 程序,其中“后台”任务运行,因为我认为您希望运行后台任务。
with Ada.Text_IO; use Ada.Text_IO;
procedure Main is
task background;
task body background is
begin
for I in 1 .. 10 loop
Put_Line ("Background:" & I'Image);
delay 1.5;
end loop;
end background;
begin
for I in 1 .. 10 loop
Put_Line ("Main" & I'Image);
delay 1.0;
end loop;
end Main;
该程序的示例输出是:
Main 1
Background: 1
Main 2
Background: 2
Main 3
Background: 3
Main 4
Main 5
Background: 4
Main 6
Background: 5
Main 7
Main 8
Background: 6
Main 9
Background: 7
Main 10
Background: 8
Background: 9
Background: 10
主任务显然独立于后台任务。由于两个任务位于同一进程中,因此在两个任务终止之前进程不得终止。
如果希望主任务等待后台任务完成后再终止,则后台任务必须创建在主任务的内部块中。
with Ada.Text_IO; use Ada.Text_IO;
procedure joined_task is
begin
-- create an inner block
declare
task background;
task body background is
begin
for I in 1 .. 10 loop
Put_Line ("Background:" & I'Image);
delay 1.5;
end loop;
end background;
begin
null;
end;
for I in 1 .. 10 loop
Put_Line ("Main:" & I'Image);
delay 1.0;
end loop;
end joined_task;
该程序的输出是:
Background: 1
Background: 2
Background: 3
Background: 4
Background: 5
Background: 6
Background: 7
Background: 8
Background: 9
Background: 10
Main: 1
Main: 2
Main: 3
Main: 4
Main: 5
Main: 6
Main: 7
Main: 8
Main: 9
Main: 10
主任务在执行循环之前等待后台任务完成。 在第一个示例中,两个任务以重叠的方式执行,而第二个示例演示了主任务如何在继续之前等待其内部块完成。第二个示例在功能上类似于在 Java 或 C 或 C++ 线程库中使用 join 命令。
您的问题有点模糊(“背景”的含义不清楚),但从代码示例来看,您似乎想要一个过程Enable,以便在调用它时,启动一个新的“后台”任务,并且Enable可以返回到它的调用者无需等待新任务终止,使新任务与调用 Enable 的原始任务同时运行。
您可以通过使用访问类型和“new”关键字动态创建此类“后台”任务:
type Background_Ref is access Background;
procedure Enable
is
B : Background_Ref := new Background;
-- A new Background task is created and starts running
-- concurrently with the present task.
begin
null;
-- This does not wait for the new task to terminate.
end Enable;
请注意,在这种情况下,程序本身将等待所有创建的后台任务终止,然后整个程序才会终止。