c++ - 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
解决方案
您正在寻找类似的东西:
#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
}
// ...
}
}
解释
模数
调用持续时间的模运算:duration % x
期望x
是以下两者之一:
另一个 duration,在这种情况下 chrono 为您完成了获取 and 的常见类型的工作
duration
,x
这将允许模数。一些任意类型,在这种情况下,内部类型
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;
}
// ...
}
}
推荐阅读
- java - 基于模式的多租户:不时出现“java.sql.SQLException:未选择数据库”
- vue.js - Vue.js 中是否有任何等效的 RecyclerView/UITableView?
- iis - 在 IIS 服务器上启用文本压缩
- javascript - Emscripten:如何从 javascript 中获取 c 中的 char 数组
- security - Grafana 可以通过 https 与 InfluxDB 通信吗?
- ansible - ansible任务中的`delegate_to`是什么意思?
- postgresql - 在 postgres 中逐行提交
- python - 将数据添加到带有 suplots 的跟踪中,以维护破折号中每个子图的数据拆分
- r - 导入 csv 给出一个只有一个变量的数据框
- python - 数据框:如何在我的一列中执行以下计算?