在我的功能中,我需要检查自上次执行以来已经过了多少时间,它大于10分钟。允许执行。解决这个问题的最简单方法是什么?
clock_t lastExecution ;
boolean isItTime()
{
// ??
}
void doJob()
{
if (isItTime())
{
//Do what I need
lastExecution = clock();
}
}
答案 0 :(得分:4)
使用现代C ++,阅读imho变得更加容易:
#include <chrono>
void f() {
using namespace ::std::chrono;
static auto last_run = steady_clock::now();
if(steady_clock::now() - last_run >= 10min) {
// well, this was easy!
}
last_run = steady_clock::now();
}
请注意,它不是线程安全的,并且“可能”在初始运行时不会进入>= 10min
条件。
此外,steady_clock
用于确保夏令时开始或结束等有趣效果不会对您的持续时间概念造成严重破坏(例如,夏令时开始前1秒和1之间的持续时间之后的第二个应该是2秒,而不是1小时和2秒)
答案 1 :(得分:2)
在MSVC ++ clock()上返回已用时间(挂钟,而不是消耗的CPU时间),因此clock()
的解决方案可以使用CLOCKS_PER_SEC
宏。
boolean isItTime()
{
return (clock()-lastExecution) >= 10*60*CLOCKS_PER_SEC;
}
然而,CppReference says std::clock
必须返回消耗的CPU时间,而不是挂钟时间。 So it seems to do on Linux因此,如果要检查挂钟时间而不是CPU时间,Linux的解决方案应该是不同的。
因此,跨平台C ++解决方案可以使用std::chrono:
std::chrono::time_point<std::chrono::system_clock> lastExecution
= std::chrono::system_clock::now();
bool isItTime()
{
std::chrono::duration<double> elapsedSeconds =
std::chrono::system_clock::now() - lastExecution;
return elapsedSeconds.count() >= /* 10 minutes */ 10 * 60;
}
void doJob()
{
if (isItTime())
{
//Do what I need
lastExecution = std::chrono::system_clock::now()
}
}
仍有细微差别需要注意,例如您可能更喜欢std::chrono::steady_clock,以防您需要10分钟的物理时间,以便isItTime()
不会返回true
以防用户提前10分钟提前,或者系统启动夏令时,或者系统只是在与互联网时间同步时更新时间。