c++ - 在 C++ 代码中设置 while 循环的执行速率以实现实时同步

标签 c++ synchronization while-loop

我正在使用 .cpp 源代码进行实时模拟。我必须每 0.2 秒(200 毫秒)取一个样本......有一个 while 循环,每个时间步都取一个样本......我想同步这个 while 循环的执行以获得每 (200 毫秒) 一个样本...我应该如何修改 while 循环?

while (1){
          // get a sample every 200 ms
         }

最佳答案

简单而准确的解决方案 std::this_thread::sleep_until :

#include "date.h"
#include <chrono>
#include <iostream>
#include <thread>

int
main()
{
    using namespace std::chrono;
    using namespace date;
    auto next = steady_clock::now();
    auto prev = next - 200ms;
    while (true)
    {
        // do stuff
        auto now = steady_clock::now();
        std::cout << round<milliseconds>(now - prev) << '\n';
        prev = now;

        // delay until time to iterate again
        next += 200ms;
        std::this_thread::sleep_until(next);
    }
}

"date.h" 延迟部分不需要。它在那里提供 round<duration>函数(现在在 C++17 中),并使其更容易打印出 duration秒。这一切都在“做事”下,与循环延迟无关。

只要得到一个chrono::time_point ,加上你的延迟,然后睡到time_point .只要你的“东西”花费的时间比你的延迟少,你的循环平均会保持你的延迟。不需要其他线程。不需要计时器。就<chrono>sleep_until .

这个例子只是为我输出:

200ms
205ms
200ms
195ms
205ms
198ms
202ms
199ms
196ms
203ms
...

关于c++ - 在 C++ 代码中设置 while 循环的执行速率以实现实时同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14945041/

相关文章:

java - 仅由一个线程写入的 volatile boolean 开关是线程安全的吗?

java - 线程获得级别

c++ - 在 while 循环中使用字符串查找和替换时的 std::out_of_range

c++ - 为什么作者声称此代码会导致种族歧视?

c++ - 使用std::condition_variable同步调用函数

c++ - OpenCV中的形态重建

java - while循环(检查键盘输入的是否不是int,然后不断询问,直到插入int)

c - 读取文件并跳过空格?

c++ - 使用 std::vector 作为可变的、完全填充的数组?

c++ - 将二维数组传递给 c++ 中的函数,两个值都在 main 方法中输入