首页 > 解决方案 > C ++中的计时计时器加倍

问题描述

我怎样才能创建一个计时器,在一定的持续时间后,它会做些什么?到目前为止,我一直在尝试使用 % 操作。我在函数开始时做了一个计时器,然后减去当前时间(now()函数),然后 i % 差 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

标签: c++chrono

解决方案


您正在寻找类似的东西:

#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
        }
        // ...
    }
}

代码版本 1 ,代码版本 2


解释

模数

调用持续时间的模运算:duration % x期望x是以下两者之一:

  • 另一个 duration,在这种情况下 chrono 为您完成了获取 and 的常见类型的工作durationx这将允许模数。

  • 一些任意类型,在这种情况下,内部类型duration应该能够与x. 不是这种情况duration是基于<double>.

要允许对其进行取模duration<double>需要使用duration_cast或使用上面的第一个取模选项和另一个duration.

比较

模运算返回 a duration,如参考中所示。要将其与int(即 0)进行比较,需要将其转换为int(因为duration并且int不可比较),这可以通过调用 count 来完成,例如:

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

或者,我们可以将其与上面所做的实际持续时间进行比较。


重要的设计说明

即使上面的代码有效并且当我们达到精确的模数时我们会做这件事,duration计数的值不是以秒为单位的,所以如果我们只是错过了 2 纳秒的 5 秒,我们将错过模数检查并且不会做我们的事情,然后我们将等待下一轮,很可能会再次错过它。模数对于试图捕捉时间是一个非常糟糕的选择,因为我们采样的时间会跳跃。更好的方法是计算自从我们最后一次将事情作为触发器以来已经有 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;
        }
        // ...
    }
}

代码^


推荐阅读