如何在 ada 包中启动单例任务

ols*_*ols 4 ada task package

这个星期天我正在做一些 Ada .. ;-)

我写了一个小的 Log 包:

log.ads:

package Log is
    procedure log (text: String);
end Log;
Run Code Online (Sandbox Code Playgroud)

日志.adb:

with Ada.Text_IO;

package body Log is

    procedure log (text: String) is
    begin
        Ada.Text_IO.Put (text);
    end log;

end Log;
Run Code Online (Sandbox Code Playgroud)

我可以这样使用它:test.adb:

with Log;

procedure Test is
begin
    Log.log ("bla bla");
end Test;
Run Code Online (Sandbox Code Playgroud)

现在,我想“改进”这个包。我希望日志程序将文本“推送”到任务中。这是执行“Ada.Text_IO.Put(文本)”的任务。任务可以是:

task Logger_Task is
    entry log (text : String);
end Logger_Task;

task body Logger_Task is
begin
    loop
        accept log (text: String) do
            Ada.Text_IO.Put (text);
        end log;
    end loop;
end Logger_Task;
Run Code Online (Sandbox Code Playgroud)

我希望 Log 客户端不知道这个任务,所以它应该隐藏在 Log 包的某个地方。我不知道如何以及在哪里实例化任务......

此任务还必须在整个应用程序期间保持活动状态。

谢谢你的帮助。

egi*_*lhh 5

你已经实例化了它。

task Logger_Task is
    entry log (text : String);
end Logger_Task;
Run Code Online (Sandbox Code Playgroud)

与创建匿名实例相同task type

task type Anonymous is
    entry log (text : String);
end Anonymous;
Logger_Task : Anonymous;
Run Code Online (Sandbox Code Playgroud)


fly*_*lyx 5

如果在包体中定义任务,可以保留procedure log接口:

with Ada.Text_IO.Unbounded_IO;
with Ada.Strings.Unbounded;

package body Log is

   task Logger_Task is
      entry log (text : String);
   end Logger_Task;

   task body Logger_Task is
      Cache: Ada.Strings.Unbounded.Unbounded_String;
   begin
      loop
         select
            accept log (text: String) do
               Cache := Ada.Strings.Unbounded.To_Unbounded_String (text);
            end log;
            Ada.Text_IO.Unbounded_IO.Put (Cache);
         or
            terminate;
         end select;
      end loop;
   end Logger_Task;

   procedure log (text: String) is
   begin
      Logger_Task.log (text);
   end log;
end Log;
Run Code Online (Sandbox Code Playgroud)

select … or terminate; 在主要任务结束时结束任务至关重要(只有在主要任务结束时才会采用此替代方案)。

Cache也很重要,因为它允许调用任务textaccept块接收到参数后继续。直接调用Putaccept 块将使调用任务等待它完成,因为它只在accept块离开后继续。