我正在编写一个进度条功能,并希望在某项任务中调用它。
void someTask() {
int j = 500000000000;
for (int i = 0; i < j; i++) {
progressBar("Iterating...", i, j);
}
}
void progressBar(string consoleOut, int current, int end) {
stringstream progressMessage;
string status = consoleOut;
string endOfString = " \r";
if (current == end) {
status += " done!";
endOfString = " \n";
}
progressMessage << status;
for (int i = status.length(); i < 40; i++) {
progressMessage << " ";
}
progressMessage << " [";
double step = ((double)current / (double)end) * 10;
for (int i = 0; i < floor(step); i++) {
progressMessage << "=";
}
for (int i = floor(step); i < 10; i++) {
progressMessage << " ";
}
progressMessage << "] " << floor(step*10) << "%";
cout << progressMessage.str() << endOfString;
}
这将产生如下输出:
Iterating... [ ] 0%
随着功能的继续,更换自身并填写进度条。我想最多每秒显示一次进度条。而不是:
progressBar("Iterating...", i, j);
我想:
if (time(0).milliseconds == 0) {
progressBar("Iterating...", i, j);
}
如果时间是SS:MS,则在时间为SS:00时调用该函数。所以它会在01:00,02:00,03:00等发生。就像现在一样,它会调用i
的每次迭代,从而导致性能下降。
我怎样才能做到这一点?
答案 0 :(得分:2)
您应该只在操作开始时存储当前时间(使用std::chrono::steady_clock
),然后在每一步中检查时间是否至少等于一秒。如果是,请更新进度条并存储新的当前时间。