【问题标题】:C++ Timer Run on Main Thead Without Block (C++11/14/17/20)C++ 定时器在主线程上无阻塞运行 (C++11/14/17/20)
【发布时间】:2020-07-20 21:53:52
【问题描述】:

如何在 C++11/14/17/20 中实现一个在主线程上运行的定时器而不阻塞主线程

喜欢:

  startTimerInCurrentTheadWithoutBlockCurrentThread(Seconds(1),[](){
//invoke method every 1 second
       method();
   });

我知道有很多项目,例如:https://www.fluentcpp.com/2018/12/28/timer-cpp/

但他们都开始了一个新线程。

【问题讨论】:

  • 所有可用的库/项目在新线程中启动计时器是有原因的。那是因为如果你不这样做,那么你的 main 方法将被 timer 方法阻塞。您肯定不希望您的程序只是继续计数而不进行任何实际处理。
  • 请不要发送垃圾标签。 C 在这里不合适,因为 lambda.不需要 C++11、14、17 和 17。
  • 几乎任何以“我们能做...”(或类似)开头的问题都可以用“是”来回答。请尝试详细说明您的问题,并edit您的问题以改进它。也请花点时间刷新the help pages,取SOtour,阅读How to Ask,以及this question checklist
  • @DebarghaRoy 在 iOS、Android 中,我们在主线程中有一个 runloop。在应用程序被杀死之前,线程一直处于活动状态。所以我想在这个主线程中有一个计时器。
  • @Someprogrammerdude 我喜欢你的自我推销 :) 今天你可以使用boost::asio::deadline_timer 不?

标签: c++ c++11


【解决方案1】:

您可以采取三种主要方法来等待一段时间:

  • 阻塞主线程
  • 让线程等待
  • 让您的主线程定期轮询时钟

您似乎不想要前两种方法。那只会让你有让主线程运行的方法,在某个地方保存启动时间,并非常定期地调用一个函数:IsItTimeToCallMyFunction(),比如在一个主循环中。

如果你的主线程中发生了一些冗长的事情,这将是非常不优雅的,它仍然会让你没有足够快地调用函数。

因此,在实践中,您的答案是“否”。 编辑:问题已更改为“如何”,因此答案变为“通过使用上述三种方法之一”。

【讨论】:

    【解决方案2】:

    说,你想要并发,但你不想要线程。你也不想阻塞主线程。

    那么答案就很清楚了。您想要协程 + 手动管理时间片

    我认为在两个并发任务之间手动操作并不是一个好主意。所以我建议你学习一些关于协程的东西。 C++ 正在将其合并到标准中,但仍然没有得到每个主流编译器或库的完全支持。你可以求助于一些第三方库。

    但是,为什么不使用线程呢?

    编辑:

    对不起,我没有仔细阅读。现在我认为你想要的是一个计时器来“中断”你当前的任务——也就是说,当指定的时间过去时提醒你。

    也许您想调查“软件中断”?据我所知,最直接的方法是给系统提供一个异常处理程序,并在超时时触发中断。

    【讨论】:

    • 在 iOS、Android 中,我们在主线程中有一个 runloop。在应用程序被杀死之前,线程一直处于活动状态。所以我想在这个主线程中有一个计时器。我想在 android 主 UI 线程中调用 Java 本机方法,然后 C++ 调用一个计时器在这个主线程上做某事而不阻塞 UI 线程。谢谢。
    • @Learing 哦,我想你可能想在每个循环结束时查询是否是时候回调定时器。我认为这不会占用太多时间
    • 听起来你需要一个事件循环。
    猜你喜欢
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 2015-05-03
    相关资源
    最近更新 更多