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
强制正确使用时间单位。
随时问我是否需要解释什么。
以下代码每隔 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
强制正确使用时间单位。
随时问我是否需要解释什么。