gpt4 book ai didi

c++ - 如何在标准 C++ 中重复定时回调?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:07 28 4
gpt4 key购买 nike

如何在标准 C++ 中执行重复的定时回调?

我在 C 中使用 SDL_AddTimer 完成了此操作,它在第一个参数(以毫秒为单位)过去后调用 Uint32 (*callback)(Uint32, void*) , 获取返回值以等待那一刻并再次调用,并重复此操作直到返回值为 0 或 SDL_RemoveTimer 被调用。

我想我可以使用可变参数模板来包装它,甚至可以使用线程链接列表来实现它,但如果有的话,我更喜欢标准库解决方案。我正在查看 std::future 及其相关类,但我仍然不清楚它们是如何使用的。

一段非常简单的代码会很有帮助。

最佳答案

一种可能的替代方法是使用标准线程。

最初的想法是这样的:

#include <thread>
#include <chrono>
#include <atomic>

std::atomic<bool> active;

void mytimethread () // function that's executed in a separate thread
{
active = true;
while (active) {
do_callback(); // you coud also use a function pointer if you prefer
std::this_thread::sleep_for (std::chrono::minutes(1)); // wait 1 minute
}
}

要激活您的计时器,您需要实例化一个线程:

thread t1 (mytimethread);  // create an launch thread 

... // do your stuff

active = false; // when you've finished you must tell the thread
t1.join (); // and wait that it returns

当然,这只是原始想法。我建议将所有这些都包装到一个很好的独立类中。

您应该注意 sleep_for() 的一个小限制: 多线程管理操作可能导致某些延迟超过请求的持续时间。对于大多数应用程序,它可以完美地完成工作,但如果这对你来说没有风险,你将被绑定(bind)到系统特定的计时器,例如 signal(SIGALRM, ...)/ linux 上的 alarm() 或 Windows 上的 SetWaitableTimer()/SetTimer()

关于c++ - 如何在标准 C++ 中重复定时回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30497113/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com