C++ 增量速度是否受时钟频率的影响

C++ 增量速度是否受时钟频率的影响,c++,clockrates,C++,Clockrates,考虑下面的循环。这是我试图解决的一个问题的简化示例。我想限制每秒调用doSomething函数的次数。由于循环运行得非常快,我想我可以使用一个速率限制器。让我们假设我通过使用不同的x数字运行它,找到了一个合适的值 unsigned int incrementionRate = x; unsigned int counter == 0; while (true) { double seconds = getElapsedSeconds(); print(seconds);

考虑下面的循环。这是我试图解决的一个问题的简化示例。我想限制每秒调用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();
    }
}
floatε=0.0001;
while(true){
双秒=getElapsedSeconds();
打印(秒);

如果(abs(seconds-floor(seconds))如果我有可能理解这个问题,您可以使用一个
std::chrono::staid_clock
,您只需在每过一秒时添加一秒

例如:

#include <chrono>

auto end_time = std::chrono::steady_clock::now();

while (true) {
    // only call doSomething once a second
    if(end_time < std::chrono::steady_clock::now()) {
        doSomething();
        // set a new end time a second after the previous one
        end_time += std::chrono::seconds(1);
    }

    // do something else
}

#包括
自动结束时间=标准::计时::稳定时钟::现在();
while(true){
//每秒钟只打一次电话
如果(结束时间<标准::计时::稳定时钟::现在(){
doSomething();
//在上一个结束时间后的第二秒设置新的结束时间
结束时间+=标准时间:秒(1);
}
//做点别的
}
如果您在循环中确实在做其他事情,则可以;如果不这样做,则会导致繁忙的等待,这只会白白消耗CPU

在这种情况下,您更应该让线程睡眠:

    std::chrono::milliseconds offset(200);
    auto next = std::chrono::steady_clock::now();
    for(;;)
    {
        doSomething();
        next += offset;
        std::this_thread::sleep_until(next);
    }

你需要包含
chrono
thread
的头。

我决定在最后使用一种更简单的方法。使用了一个可调整的时间间隔,只存储了最新的更新时间,没有引入任何新机制。老实说,现在我不知道为什么一开始我就想不起来。过度思考是一个问题em.:)


我宁愿用秒除以次数得到一个具体的偏移量,然后下一个周期就过去了。什么是
getElapsedSeconds
print
?我不明白这两个代码是如何每秒调用
doSomething
一次的。在第一个代码中似乎没有(精确的)传递的时间和对
doSomething
的调用之间的关系,因为它只计算循环迭代次数,是该
的其余部分,而
循环应该保持循环,并且只调用
doSomething()
每秒一次-或者睡眠可以吗?第二个循环只能在纯金属/实时操作系统上工作,如果是这种情况,可以使用计时器中断。在一般情况下,不能保证在“espsilon”中调用getElapsedSeconds()tiemspan,所以你会错过一帧。没有平台不可知的解决方案。你能给出你将使用的平台的详细信息吗?为什么睡眠不是一个选项?这对睡眠的精确性有太多的信心,直到;如果你关心精确性,在事件发生前睡眠10毫秒,然后旋转。然而,我喜欢它没有错误累积。@Yakk AdamNevraumont I也没有假设有如此高的精度要求,这一点在问题中也没有提到。使用典型的多线程操作系统和10毫秒或类似的时间片,即使使用100 us的时间缓冲区,我们也可能无法实现。带有高精度振荡器和定时器中断的微控制器可能更好但由于问题被编辑,排除了这个解决方案,答案已经过时了……它可能对其他读者仍然有用,所以我不会删除它。
double lastUpdateTimestamp = 0;
const double updateInterval = 1.0;

while (true) {

    double seconds = getElapsedSeconds();
    print(seconds);

    if ((elapsedSeconds - lastUpdateTimestamp) >= updateInterval) {
        doSomething();
        lastUpdateTimestamp = elapsedSeconds;
    }
}