对于正在执行的任务,实现基于控制台的进度指示器的简单方法是什么,但我无法预测需要多长时间?
当我用Clipper编码时,我常常这样做,而这只是迭代字符'/',' - ','\','|'的问题.并将它们放在同一个地方.
在C++中用于实现(或类似)的任何方式/链接/库?
目标是*nix环境.
编辑:
Zan*_*ynx 23
一个非常简单的方法是打印一个字符串后跟一个'\r'
字符.这是回车本身,在大多数控制台上,它将光标返回到行的开头而不向下移动.这允许您覆盖当前行.
如果您正在写入stdout或cout或clog,请记住fflush或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');
}
}
Run Code Online (Sandbox Code Playgroud)
当然,这是非标准的,因为亚秒usleep()
,我不确定是否有任何保证可以\b
删除一个字符,但它适用于大多数平台.\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;
}
Run Code Online (Sandbox Code Playgroud)
确保链接到-lcurses
或-lncurses
.这应该适用于任何类似的UNIX.