【发布时间】:2021-08-24 01:03:23
【问题描述】:
考虑下面的循环。这是我试图解决的问题的简化示例。我想限制每秒调用 doSomething 函数的次数。由于循环工作得非常快,我想我可以使用速率限制器。假设我通过使用不同的 x 数字运行它找到了合适的值。
unsigned int incrementionRate = x;
unsigned int counter == 0;
while (true) {
double seconds = getElapsedSeconds();
print(seconds);
counter = (counter + 1) % incrementionRate;
if (counter == 0) {
doSomething();
}
}
我想知道如果我使用较低的时钟频率,调用 doSomething 函数的次数是否会减少。在这种情况下,我想将调用 doSomething 函数的次数限制为每秒一次。我写的第二个循环如下。
float epsilon = 0.0001;
while (true) {
double seconds = getElapsedSeconds();
print(seconds);
if (abs(seconds - floor(seconds)) <= epsilon) {
doSomething();
}
}
这对不同的时钟周期有用还是仍然存在问题?另外,我想知道是否有更好的方法来做到这一点。我以前从未使用过时钟频率,并试图了解在使用有限资源时关注点有何不同。
注意:不能使用睡眠。
【问题讨论】:
-
我宁愿将秒除以次数以获得具体的偏移量,然后 sleep until 下一个周期过去了。
-
getElapsedSeconds和print是什么?我不明白这两个代码如何每秒调用一次doSomething。首先,经过的时间和对doSomething的调用之间似乎没有(准确的)关系,因为它只计算循环迭代 -
这个
while循环的其余部分是否应该继续循环,并且每秒只调用一次doSomething()- 或者睡觉可以吗? -
第二个循环只能在裸机/实时操作系统上工作,如果你在这种情况下,你可以使用定时器中断。在一般情况下,您不能保证 getElapsedSeconds() 将在“espsilon”tiemspan 内被调用,因此您会错过一帧。对此没有平台无关的解决方案。
-
您能否提供有关您将使用的平台的详细信息?为什么睡眠不是一种选择?
标签: c++ clockrates