【发布时间】:2017-06-12 12:15:17
【问题描述】:
我在远程 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 应该成功地将光标放回 Progress 中的 P,而不管终端宽度如何......
我错了吗?如果是这样,我如何(如果可能)得到我想要的?如果不是,那是什么问题?
【问题讨论】:
标签: c++ linux terminal openmp carriage-return