如何在Ada中实现后台任务?

问题描述 投票:0回答:2

有没有办法在后台运行 Ada 任务?

封装体主要是

   任务类型Background为结束Background;

   任务主体背景是
         
   开始
        
      环形
         
         延迟1.0;
         做东西;
         
      结束循环;
         
   结束背景;

   
   程序启用是
      
     B_TASK:后台;
   开始
      
      --请不要在这里等待..
      无效的;
      
   结束启用;
   

主要结束;

task ada
2个回答
0
投票

您还没有描述“背景”的含义。

这是一个简单的 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 命令。


0
投票

您的问题有点模糊(“背景”的含义不清楚),但从代码示例来看,您似乎想要一个过程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;

请注意,在这种情况下,程序本身将等待所有创建的后台任务终止,然后整个程序才会终止。

© www.soinside.com 2019 - 2024. All rights reserved.