首页 文章

NCurses不恢复终端行为

提问于
浏览
0

你好亲爱的公报,

我正在为我正在开发的并行软件创建终端动画状态报告 . 我正在使用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行,echo工作,但有足够的空白 .

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

编辑:

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

  • curses(ncurses)在openMP下运行完美,然后你可以想象一些执行数学计算的线程和一个线程(只有一个,请注意)给出一些运行时信息 .

  • curse(ncurses)与MPI不兼容 . 好吧,正确的陈述是与MPI兼容 . MPI对stdin / stdout / stderr非常复杂,因为所有MPI进程的所有输出都可以重定向到显示器(可以指定) . 使用任何高级终端输出覆盖库将导致代码错误或意外行为 .

这是由MPI常见问题支持的:

也许吧 . 但可能不是 . Open MPI提供相当复杂的stdin / stdout / stderr转发 . >但是,对于通常需要直接控制终端的curses,ncurses,readline或其他>复杂的I / O包,它不能很好地工作 . 每个应用程序和I / O库都不同 - 您应该尝试查看是否支持您的应用程序 . 但有可能它不会起作用 . 抱歉 . :-(

发现here (MPI reference) .

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

感谢所有帮助我的公报,

玩得开心

GF

2 回答

  • 0

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

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

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

    • GUI中的 MPI_Comm_accept 和计算部分中的 MPI_Comm_connect 的组合 Build 了一个可用于在两个部分之间发送消息的内部通信器 . 计算部分可以是例如将定期状态消息发送到GUI . 如有必要,互通机构可以进一步向内部通信人员发送 .

    • 计算完成后,通信部分应通过调用 MPI_Comm_disconnect 断开连接 .

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

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

  • 1

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

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

相关问题