C++ 中 JavaScript setInterval 的等价物是什么?

What is the equivalent to JavaScript setInterval in C++?

以下代码每隔 5 秒打印一次传递给函数 foo 的参数。

function foo(arg) {
  console.log(arg);
}

setInterval(() => foo(5), 5000);

我找到了这个答案: 以周期性间隔调用函数,但我不知道如何以周期性间隔调用函数,如 javascript 中所示代码。

是否有与 C++ 中的 javascript 代码等效的代码?
谢谢

您实际上可以非常接近 javascript 语法:

#include <iostream>
#include <chrono>
#include <thread>
#include <functional>
#include <memory>
#include <atomic>

using cancel_token_t = std::atomic_bool;

template<typename Fnc>
void set_interval(Fnc fun, std::chrono::steady_clock::duration interval,
                  std::shared_ptr<cancel_token_t> cancel_token=nullptr)
{
  std::thread([fun=std::move(fun), interval, tok=std::move(cancel_token)]()
  { 
    while (!tok || !*tok) // Call until token becomes true (if it is set)
    { 
      auto next = std::chrono::steady_clock::now() + interval;
      fun();
      std::this_thread::sleep_until(next);
    }
  }).detach();
}

void foo(int n)
{
  std::cout << "Hello from foo("<<n<<")!\n";
}

int main()
{
using namespace std::chrono_literals;
  auto cancel = std::make_shared<cancel_token_t>(false);
  int x = 2;
  // Ordinary rules for lambda capture apply so be careful 
  // about lifetime if captured by reference.
  set_interval([x]{foo(5+x);}, 1000ms, cancel);
  //set_interval([x]{foo(5+x);}, 1000ms); // Without token, runs until main exits.
  std::this_thread::sleep_for(3s);
  *cancel=true;
}

我修改了链接的问题并添加了一个取消标记,当设置为 true 时,它会协同取消线程。 *cancel=true 和循环检查之间当然有一些延迟。

我将令牌设置为可选,如果不使用,当进程从 main return 后退出时线程将死亡。虽然 C++ 不能保证这一点,但它可以在通用平台上工作。

std::chrono 强制正确使用时间单位。

随时问我是否需要解释什么。