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行,回声有效,但还有足够的空白。
非常感谢你的帮助,玩得开心
编辑:
我想与您分享我在尝试解决问题时发现的一些信息:
MPI常见问题支持:
也许。但可能不是。
Open MPI提供了相当复杂的stdin / stdout / stderr转发。 &gt;但是,它不适用于curses,ncurses,readline或其他通常需要直接控制终端的复杂I / O包。
每个应用程序和I / O库都不同 - 您应该尝试查看是否支持您的&gt ;.但是很有可能它不会起作用。
对不起。 : - (
我发现的是,即使您只指定一个MPI进程来管理所有curses输出(只是该进程在开始时调用initscr()而在他的代码部分结束时调用endwin() )没有办法强制curses使用完整的终端(只有默认的UNIX 24x80可用)。 一旦MPI完成,您的整个终端将继续以24x80模式工作,直到调用重置为止。
感谢帮助我的所有公报,
玩得开心
GF
答案 0 :(得分:1)
一种可能的解决方案是将文本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
的组合建立了一个可用于在两个部分之间发送消息的互通器。计算部分可以是例如将定期状态消息发送到GUI。如果有必要,可以进一步平衡对讲机&#34;
计算完成后,通讯部分应通过拨打MPI_Comm_disconnect
断开连接。
GUI应调用MPI_Close_port
并完成自己的执行。
在这种情况下,GUI部分可以是文本模式curses应用程序本地启动或通过SSH,X11 GUI应用程序或其他任何其他方式远程启动。
答案 1 :(得分:0)
它应该工作。关于“并行”的评论表明多线程,这可能意味着您的输出没有像人们预期的那样被刷新。
可能这是同一个问题(Ncurses limited output size),为此提供了更多信息。这两个问题都没有提供足够的细节来提供更多的通用建议。