这个星期天我正在做一些 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 包的某个地方。我不知道如何以及在哪里实例化任务......
此任务还必须在整个应用程序期间保持活动状态。
谢谢你的帮助。
你已经实例化了它。
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)
如果在包体中定义任务,可以保留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也很重要,因为它允许调用任务text在accept块接收到参数后继续。直接调用Putaccept 块将使调用任务等待它完成,因为它只在accept块离开后继续。
| 归档时间: |
|
| 查看次数: |
237 次 |
| 最近记录: |