C ++中的计时定时器加倍

Chrono timer in C++ to double

我如何创建一个计时器,在一定时间后它会执行某些操作?到目前为止,我一直在尝试使用 % 操作。我在函数开始时制作了一个计时器并减去当前时间(now()函数)然后我将差异百分比减去 5 因为我想要 5 秒过去:

(at the start of the program i defined start as high_resolution_clock::now())
duration<double> dur = start-high_resolution_clock::now();
if(dur%5==0)

我得到的错误是:没有运算符“==”匹配这些操作数——操作数类型是:std::chrono::duration> == int

您正在寻找类似的东西:

#include <chrono>

int main() {
    using namespace std::chrono_literals;
    using std::chrono::high_resolution_clock;
    auto start = high_resolution_clock::now();
    bool condition = true;
    while (condition) {
        auto time_passed = high_resolution_clock::now() - start;
        if( time_passed % 5s == 0s ) {
            // do your thing every 5 seconds
        }
        // ...
    }
}

Code version 1, Code version 2


说明

取模

modulo operation for duration 调用:duration % x 期望 x 是以下两者之一:

  • 另一个持续时间,在这种情况下,chrono 会为您完成获取常见类型 durationx,这将允许取模。

  • 一些任意类型,在这种情况下duration的内部类型应该能够用 x 进行取模。基于 <double>.

  • duration 并非如此

要允许基于 <double>duration 取模,需要使用 duration_cast 或使用上面的第一个取模选项,以及另一个 duration .

比较

模运算 returns a duration 可以在参考资料中看到。要将其与 int(即 0)进行比较,需要将其转换为 int(因为 durationint 不可比)并且可以这样做调用计数,例如:

if ( (time_passed % 5s).count() == 0 )

或者,我们可以像上面那样将它与实际持续时间进行比较。


一个重要的设计说明

即使上面的代码有效并且当我们达到精确的模数时我们会做这件事,duration 计算的值不是以秒为单位,所以如果我们错过了 5 秒 2 纳秒我们将错过模数检查并且不会做我们的事情,然后我们将等待下一轮并且很可能会再次错过它。模数对于试图赶上时间来说是一个非常糟糕的选择,因为我们采样的时间会跳跃。更好的方法是计算自从我们上次做这件事以来已经有 5 秒或更长时间作为触发器。可以用这段代码实现:

int main() {
    using namespace std::chrono_literals;
    using std::chrono::high_resolution_clock;
    auto start = high_resolution_clock::now();
    auto last_time_we_did_the_thing = start;
    bool condition = true;
    while (condition) {
        auto curr_time = high_resolution_clock::now();
        auto time_since_last_do_the_thing
           = curr_time - last_time_we_did_the_thing;
        if( time_since_last_do_the_thing >= 5s ) {
            // do your thing every 5 seconds
            last_time_we_did_the_thing = curr_time;
        }
        // ...
    }
}

Code ^