C++ 找出当前时间是否为新秒的开始

C++ 找出当前时间是否为新秒的开始,c++,time,C++,Time,我正在编写一个进度条函数,并希望在执行某些任务时调用它 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 progressMessa

我正在编写一个进度条函数,并希望在执行某些任务时调用它

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;
}
替换自身,并在功能继续时填充进度条。不过,我希望每秒最多显示一次进度条。而不是:

progressBar("Iterating...", i, j);
我想:

if (time(0).milliseconds == 0) {
    progressBar("Iterating...", i, j);
}
如果时间为SS:MS,则在时间为SS:00时调用该函数。所以它将发生在01:00、02:00、03:00等等。就像现在一样,它调用
i
的每一次迭代,破坏性能


如何实现这一点?

您只需在操作开始时存储当前时间(使用
std::chrono::staid_clock
),然后在每个步骤上检查时间是否至少迟于1秒。如果是这样,请更新进度条并存储新的当前时间。

您只需在操作开始时存储当前时间(使用
std::chrono::staid_clock
),然后在每个步骤上检查时间是否至少迟于1秒。如果是这样,请更新进度条并存储新的当前时间。

可能需要重新考虑您提出的解决方案:如果您在0毫秒时从999毫秒变为1毫秒而没有进行测试,会发生什么情况(例如,您的进程因高优先级的工作而脱离CPU)。这是一个很好的观点。我想我可以在
main()
中将全局
time\t timeSeed
var设置为当前时间,然后在
if
语句中,检查
time(0)>timeSeed
,并在
progressBar()内检查
timeSeed=time(0)
function。可能需要重新考虑您提出的解决方案:如果您在0毫秒时从999毫秒到1毫秒没有进行测试,会发生什么情况(例如,您的进程被更高优先级的工作从CPU中断)。这是一个很好的观点。我想我可以在
main()
中将全局
time\t timeSeed
var设置为当前时间,然后在
if
语句中,检查
time(0)>timeSeed
,以及
timeSeed=time(0)
函数中的
timeSeed=time(0)
if (time(0).milliseconds == 0) {
    progressBar("Iterating...", i, j);
}