C ++控制台进度指示器

实现正在执行的任务的基于控制台的进度指示器的简单方法是什么,但我无法预测需要多less时间?

当我在Clipper中编写代码的时候,我曾经这样做过,只不过是遍历字符'/',' – ','\','|' 并把它们放在同一个地方。

任何方式/链接/库在C ++中做的(或类似的)?

目标是* nix环境。

编辑:

  • 标题更加连贯和通用;
  • 增加目标环境。

Solutions Collecting From Web of "C ++控制台进度指示器"

一个非常简单的方法就是打印出一个字符串,后跟一个'\r'字符。 这是回车本身和大多数控制台,它将光标返回到行的开始,而不是向下移动。 这允许你覆盖当前行。

如果你正在写stdout或者cout或者clog,记得flush或者std :: flush这个流来立即输出这个行。 如果你正在写stderr或cerr,那么这个流是无缓冲的,并且所有的输出是立即的(和低效的)。

更复杂的方法是使用像curses这样的屏幕绘图库。 Windows控制台有一些其他的方式来设置他们直接屏幕写作,但我不知道他们是什么。

你可以尝试像这样:

 void spinner(int spin_seconds) { static char const spin_chars[] = "/-\\|"; unsigned long i, num_iterations = (spin_seconds * 10); for (i=0; i<num_iterations; ++i) { putchar(spin_chars[i % sizeof(spin_chars)]); fflush(stdout); usleep(100000); putchar('\b'); } } 

当然,这是非标准的,因为亚秒级的usleep() ,我不确定是否有任何保证可以删除一个字符,但是它可以在大多数平台上运行。 您也可以尝试\r而不是\b不做的伎俩。 否则,请尝试查找curses的版本。

编辑(诅咒样本)

这应该让你开始:

 #include <curses.h> #include <unistd.h> void spinner(int spin_seconds) { static char const spin_chars[] = "/-\\|"; unsigned long i, num_iterations = (spin_seconds * 10); for (i=0; i<num_iterations; ++i) { mvaddch(0, 0, spin_chars[i & 3]); refresh(); usleep(100000); } } int main() { initscr(); /* initializes curses */ spinner(10); /* spin for 10 seconds */ endwin(); /* cleanup curses */ return 0; } 

确保与-lcurses-lncurses链接。 这应该可以在任何UNIX上工作。

Boost有一个可以帮助这些事情的进度库

哇, clipper ,也许你正在谈论@行,列入语言内置的东西? (只有修辞问题…)

你可以用printf做简单的进度条:你可以省略最后的换行符。 您可以明显地开始或结束字符串\ b为了叠印字符。 做这个传统的方法很简单。

我记得,Eclipse UI指南建议进度指标,无论您能够告诉您实际的进展情况。 我认为理论是说什么都比没有好,只要尽力而为就可以了。

你可能需要的唯一技巧是有可能打败行缓冲。 每次输出操作后都要确保fflush(stdout) 。 (或者ostream :: flush())