【发布时间】: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可以,但是有很多空白。
非常感谢您的帮助,玩得开心
编辑:
我想与您分享一些我在尝试解决我的问题时发现的信息:
- curses (ncurses) 在 openMP 下完美运行,那么您可以想象一些线程在执行您的数学计算,而一个线程(只有一个,请注意)提供一些运行时信息。
- curse (ncurses) 与 MPI 不兼容。好吧,正确的说法是“不完全”与 MPI 兼容。 MPI 对 stdin/stdout/stderr 非常复杂,因为所有 MPI 进程的所有输出都可以重定向到显示器(可以指定)。使用任何高级终端输出覆盖库都会导致代码错误或意外行为。
MPI 常见问题解答支持:
也许吧。但可能不会。
Open MPI 提供相当复杂的标准输入/标准输出/标准错误转发。 >但是,它不适用于 curses、ncurses、readline 或其他通常需要直接控制终端的复杂 I/O 包。
每个应用程序和 I/O 库都不同——您应该尝试查看您的 > 是否受支持。但很有可能它不会起作用。
对不起。 :-(
我发现,即使您只指定一个 MPI 进程来管理所有的 curses 输出(只是该进程在代码的开头调用 initscr() 并在其代码部分的末尾调用 endwin())无法强制curses 使用完整的终端(只有默认的UNIX 24x80 可用)。 一旦 MPI 完成,您的整个终端将继续以 24x80 模式工作,直到调用重置。
感谢所有帮助过我的社区,
玩得开心
gf
【问题讨论】:
标签: c++ mpi openmp ncurses curses