NCurses不恢复终端行为

时间:2015-03-20 11:08:43

标签: c++ mpi openmp ncurses curses

Hello亲爱的Communauts,

我正在为我正在开发的并行软件创建终端动画状态报告。我正在使用NCurses。 我遇到了与恢复终端标准行为有关的问题。 在运行我的软件后,终端只有24行,无论我是否打电话给endwin()或者我都没有。 这里是简化的代码:

int size=10;
initscr();
refresh();
while(KeepAlive){
      int j=1;
      mvprintw(j,0,/*Blah blah header*/));
      for(int i=0;i<size;i++){
          j++;  
          mvprintw(j,0,/*Some blah blah*/);
       }
       refresh();
       usleep(1000000);
}
endwin();

KeepAlive是由另一个线程更改的控件变量(因此while不是无限循环,而是受控循环)。 运行此软件后,我的终端只有24行,回声有效,但还有足够的空白。

非常感谢你的帮助,玩得开心

编辑:

我想与您分享我在尝试解决问题时发现的一些信息:

  1. curses(ncurses)在openMP下运行完美,然后你可以想象一些执行数学计算的线程和一个线程(只有一个,请注意)给出一些运行时信息。
  2. curse(ncurses)与MPI不兼容。好吧,正确的陈述是&#34;不完全&#34;与MPI兼容。 MPI对stdin / stdout / stderr非常复杂,因为所有MPI进程的所有输出都可以重定向到显示器(可以指定)。使用任何高级终端输出覆盖库将导致代码错误或意外行为。
  3. MPI常见问题支持:

      

    也许。但可能不是。

         

    Open MPI提供了相当复杂的stdin / stdout / stderr转发。 &gt;但是,它不适用于curses,ncurses,readline或其他通常需要直接控制终端的复杂I / O包。

         

    每个应用程序和I / O库都不同 - 您应该尝试查看是否支持您的&gt ;.但是很有可能它不会起作用。

         

    对不起。 : - (

    找到here (MPI reference)

    我发现的是,即使您只指定一个MPI进程来管理所有curses输出(只是该进程在开始时调用initscr()而在他的代码部分结束时调用endwin() )没有办法强制curses使用完整的终端(只有默认的UNIX 24x80可用)。 一旦MPI完成,您的整个终端将继续以24x80模式工作,直到调用重置为止。

    感谢帮助我的所有公报,

    玩得开心

    GF

2 个答案:

答案 0 :(得分:1)

一种可能的解决方案是将文本GUI与其余的MPI代码完全分离,并使两个部分通过MPI-2的客户端/服务器机制相互通信。这意味着:

  1. 将GUI作为单例MPI程序运行,即调用MPI_Init{_thread}但未通过mpiexec启动的程序。然后它应该通过调用MPI_Open_port打开一个侦听端口。该调用返回一个字符串端口名称,该名称必须提供给应用程序的计算部分。然后,GUI部分应该通过调用阻止MPI_Comm_accept来开始侦听连接。

  2. 计算部件通常通过mpiexec启动。它应该通过从(1)给出端口名称调用MPI_Comm_connect来连接到GUI。

  3. GUI中的MPI_Comm_accept和计算部分中的MPI_Comm_connect的组合建立了一个可用于在两个部分之间发送消息的互通器。计算部分可以是例如将定期状态消息发送到GUI。如果有必要,可以进一步平衡对讲机&#34;

  4. 计算完成后,通讯部分应通过拨打MPI_Comm_disconnect断开连接。

  5. GUI应调用MPI_Close_port并完成自己的执行。

  6. 在这种情况下,GUI部分可以是文本模式curses应用程序本地启动或通过SSH,X11 GUI应用程序或其他任何其他方式远程启动。

答案 1 :(得分:0)

它应该工作。关于“并行”的评论表明多线程,这可能意味着您的输出没有像人们预期的那样被刷新。

可能这是同一个问题(Ncurses limited output size),为此提供了更多信息。这两个问题都没有提供足够的细节来提供更多的通用建议。