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 会为您完成获取常见类型 duration
和 x
,这将允许取模。
一些任意类型,在这种情况下duration
的内部类型应该能够用 x
进行取模。基于 <double>
.
的 duration
并非如此
要允许基于 <double>
的 duration
取模,需要使用 duration_cast
或使用上面的第一个取模选项,以及另一个 duration
.
比较
模运算 returns a duration
可以在参考资料中看到。要将其与 int
(即 0)进行比较,需要将其转换为 int
(因为 duration
和 int
不可比)并且可以这样做调用计数,例如:
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;
}
// ...
}
}
我如何创建一个计时器,在一定时间后它会执行某些操作?到目前为止,我一直在尝试使用 % 操作。我在函数开始时制作了一个计时器并减去当前时间(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 会为您完成获取常见类型
duration
和x
,这将允许取模。一些任意类型,在这种情况下
duration
的内部类型应该能够用x
进行取模。基于<double>
. 的
duration
并非如此
要允许基于 <double>
的 duration
取模,需要使用 duration_cast
或使用上面的第一个取模选项,以及另一个 duration
.
比较
模运算 returns a duration
可以在参考资料中看到。要将其与 int
(即 0)进行比较,需要将其转换为 int
(因为 duration
和 int
不可比)并且可以这样做调用计数,例如:
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;
}
// ...
}
}