2017-03-01 6 views
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のすべての反復を呼び出し、殺害のパフォーマンスを呼び出します。

どうすればこの問題を解決できますか?

+0

提案された解決策を再検討したいかもしれません:0msでテストせずに999msから1msになるとどうなりますか(たとえば、あなたのプロセスが優先度の高い作業でCPUからバンプされたとします)。 – ShadowRanger

+0

それは良い点です。 'time(0)> timeSeed'と' timeSeed = time(0) 'がチェックされているかどうかを確認するために、グローバルな' time_t timeSeed' varを 'main()'で現在の時刻に設定し、 'progressBar()'関数の中で実行します。 – gator

答えて

2

操作の開始時に現在の時刻(std::chrono::steady_clockを使用)を保存してから、各手順で少なくとも1秒後かどうかを確認するだけです。その場合は、プログレスバーを更新して新しい現在の時刻を保存します。