【问题标题】:NCurses not restoring terminal behaviorNCurses 不恢复终端行为
【发布时间】:2015-05-23 18:40:38
【问题描述】:

亲爱的社区,你好,

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

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可以,但是有很多空白。

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

编辑:

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

  1. curses (ncurses) 在 openMP 下完美运行,那么您可以想象一些线程在执行您的数学计算,而一个线程(只有一个,请注意)提供一些运行时信息。
  2. curse (ncurses) 与 MPI 不兼容。好吧,正确的说法是“不完全”与 MPI 兼容。 MPI 对 stdin/stdout/stderr 非常复杂,因为所有 MPI 进程的所有输出都可以重定向到显示器(可以指定)。使用任何高级终端输出覆盖库都会导致代码错误或意外行为。

MPI 常见问题解答支持:

也许吧。但可能不会。

Open MPI 提供相当复杂的标准输入/标准输出/标准错误转发。 >但是,它不适用于 curses、ncurses、readline 或其他通常需要直接控制终端的复杂 I/O 包。

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

对不起。 :-(

找到here (MPI reference)

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

感谢所有帮助过我的社区,

玩得开心

gf

【问题讨论】:

    标签: c++ mpi openmp ncurses curses


    【解决方案1】:

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

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

    2. 计算部分照常通过mpiexec 启动。它应该通过调用 MPI_Comm_connect 来连接到 GUI,给定来自 (1) 的端口名称。

    3. GUI 中的MPI_Comm_accept 和计算部分中的MPI_Comm_connect 的组合建立了一个可用于在两个部分之间发送消息的互通器。计算部分可以例如定期向 GUI 发送状态消息。如有必要,内部通信器可以进一步“扁平化”为内部通信器。

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

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

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

    【讨论】:

    • 感谢您的建议。我无法弄清楚你回答的第一点的一部分是什么意思。我应该使用一对终端来调用其中一个计算部分并在第二个中调用监视器吗?
    • NVM 在这里找到了你的另一个答案stackoverflow.com/questions/15007164/…
    【解决方案2】:

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

    很可能这是同一问题 (Ncurses limited output size),已提供更多信息。这两个问题都没有提供足够详细的信息来提供一般性建议。

    【讨论】:

    • 感谢您的回答。稍后我将尝试制作一种虚拟软件来重现该行为。无论如何,即使我使用的是 openmp,也只有一个可用线程提交输出。您需要什么样的附加信息?提前致谢
    • 我记得最近与某人的一次讨论中,由于线程的完成方式,endwin 实际上并没有被调用(至少,它什么也没做)。一个完整的代码示例,让其他人测试它真的很有帮助。
    • 我发现问题是由 ncurses+MPI 交互引发的。只需使用 OpenMP,ncurses 就可以像魅力一样工作。我正在研究解决方案。
    • @jetstream,OpenMP 是一种在进程内部工作的线程技术。它不执行任何 I/O 重定向,因此不会弄乱 ncurses。
    猜你喜欢
    • 1970-01-01
    • 2016-11-09
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2019-05-05
    相关资源
    最近更新 更多