我在远程Linux服务器上运行c ++代码,可通过MobaXterm访问。这个过程需要一段时间并且是多线程的,所以我添加了一个进度打印机制,如下所示:
void update_progress() {
omp_set_lock(&lock);
string progress = get_threads_progress();
cout << "\rProgress " << progress;
omp_unset_lock(&lock);
}
有三个主题,它可能看起来像这样:
Progress | 23/100 | 42/100 | 89/200
回车就在那里,所以我可以在一条线上看到工作的进展。在48核机器上运行代码时问题就出现了:进度 对于终端,字符串太长,行换行并且回车仅将光标设置回当前行的开头。例如:
// Several threads run this in parallel
for (int i=1; i<=5; ++i) {
update_progress();
}
我会得到以下输出:
Progress | 23/100 | 41/100 | 86/100 | 19/100 | 3/100 | 97/100 | 54/1
Progress | 23/100 | 42/100 | 86/100 | 19/100 | 3/100 | 97/100 | 54/1
Progress | 23/100 | 42/100 | 86/100 | 20/100 | 3/100 | 97/100 | 54/1
Progress | 23/100 | 42/100 | 87/100 | 20/100 | 3/100 | 97/100 | 54/1
00 | 23/100 | 21/100
我假设回车\r
应成功将光标放回P
Progress
,而不管终端宽度......
我错了吗?如果是这样,我如何(如果可能的话)得到我想要的东西?如果没有,问题是什么?
答案 0 :(得分:4)
回车不在您的程序或标准库中处理,而是由显示文本的终端程序处理。它只会到达当前行的开头,即光标当前所在的行,如果有一个包裹,则不是前一行的开头。因此,请确保您打印的文字不够长,不足以导致包装。
答案 1 :(得分:0)
在Putty中可以关闭自动换行模式:
Settings -> Terminal -> [ ] Auto wrap mode initially on
默认设置为开启。关闭它会禁用自动换行,而是保持线不间断。这也意味着你只能从每条长线上看到窗口宽度允许的符号数量。因此,需要一个支持水平滚动的寻呼机,例如less
,才能查看长行的文字。
或者在GNU screen
会话中运行您的程序并使用 Ctrl a :wrap
来切换换行模式。