0
私はプログレスバー機能を書いていて、何らかのタスクの間にそれを呼びたいと思っています。現在の時刻が新しい秒の始まりであるかどうかを調べる
Iterating... [ ] 0%
自体の交換機能が継続するプログレスバーを埋める:
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;
}
これは、のような出力を与えます。私は1秒に1回、進捗バーを表示したい。代わりに:
progressBar("Iterating...", i, j);
私が欲しい:
if (time(0).milliseconds == 0) {
progressBar("Iterating...", i, j);
}
時間はSSだったら:00:時間がSSであればMS、関数が呼び出されます。それは01:00、02:00、03:00などで発生します。今のように、それはi
のすべての反復を呼び出し、殺害のパフォーマンスを呼び出します。
どうすればこの問題を解決できますか?
提案された解決策を再検討したいかもしれません:0msでテストせずに999msから1msになるとどうなりますか(たとえば、あなたのプロセスが優先度の高い作業でCPUからバンプされたとします)。 – ShadowRanger
それは良い点です。 'time(0)> timeSeed'と' timeSeed = time(0) 'がチェックされているかどうかを確認するために、グローバルな' time_t timeSeed' varを 'main()'で現在の時刻に設定し、 'progressBar()'関数の中で実行します。 – gator