艾达:我可以有两个不同的控制台窗口吗?

时间:2014-08-20 10:29:41

标签: ada gnat

我使用GNAT 2014进行Ada项目,我有一个简单的(希望)问题。我可以有两个游戏机吗?#34;同时开放?

让我解释一下原因:我的程序将大量日志记录数据输出到控制台。我想要的是拥有两个独立的控制台,一个打印程序输出,一个打开用户输入。

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

2 个答案:

答案 0 :(得分: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后,您可以使用不同的&#34;控制台&#34;使用所有常用的Ada.Text_IO输出程序:

Put_Line (File => Consoles (Parser_Errors),
          Item => "Error 42: Could not parse statement.");

答案 1 :(得分:1)

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

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

当然,可以使用简单的Put_Line(Standard_Error,&#34; ...&#34;)甚至文件来完成相同的方法,但GNATCOLL.Traces可以动态配置,这通常更方便。