0

我将 GNAT 2014 用于 Ada 项目,我有一个简单的(我希望的)问题。我可以同时打开两个“控制台”吗?

让我解释一下原因:我的程序向控制台输出了大量的日志记录数据。我想要的是有两个单独的控制台,一个打印程序输出,一个接受用户输入。

这是可行的吗?或者这是在操作系统方面运行的东西,而 Ada 无法控制?我可以用 GtkAda 实现我想要的,但是因为我想使用尽可能少的 3rd 方库,所以我想先知道是否有本地方式(同时考虑到我需要发出的命令非常基本,比如“退出”或“暂停”,控制台输入就足够了)。

4

2 回答 2

2

考虑为您想要的每个非交互式“控制台”创建一个文件:

with Ada.Text_IO;

generic
   type Names is (<>);
package Generic_Consoles is
   procedure Open_Or_Create;
   function File (Name : in Names) return Ada.Text_IO.File_Access;
end Generic_Consoles;

package body Generic_Consoles is
   Files : array (Names) of aliased Ada.Text_IO.File_Type;

   procedure Open_Or_Create is
      use Ada.Text_IO;
   begin
      for Name in Files'Range loop
         begin
            Open (File => Files (Name),
                  Mode => Append_File,
                  Name => Names'Image (Name));
         exception
            when others =>
               Create (File => Files (Name),
                       Mode => Append_File,
                       Name => Names'Image (Name));
         end;
      end loop;
   end Open_Or_Create;

   function File (Name : in Names) return Ada.Text_IO.File_Access is
   begin
      return Files (Name)'Access;
   end File;
end Generic_Consoles;

实例化包并调用Open_Or_Create后,您可以将不同的“控制台”与所有常见的 Ada.Text_IO 输出过程一起使用:

Put_Line (File => Consoles (Parser_Errors),
          Item => "Error 42: Could not parse statement.");
于 2014-08-21T11:55:03.620 回答
1

例如,您可以将 GNATCOLL.Traces 用于日志框架(而不是我假设 Put_Line)。这将允许您精确控制日志应该去哪里,特别是一些日志可以配置为发送到一个文件,一些到终端。

您可以做的一件事是将一些日志发送到一个文件,然后在您的第二个终端中监视该日志文件。这也更方便,因为它允许您在日志中向上滚动,而终端往往会丢失较旧的日志。

当然,同样的方法可以用一个简单的 Put_Line (Standard_Error, "...") 甚至文件来完成,但是 GNATCOLL.Traces 是动态配置的,这通常更方便。

于 2014-08-20T12:36:22.280 回答