提问者:小点点

C++定时器在主机上无块运行(C++11/14/17/20)


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

如:

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

我知道有很多这样的项目:https://www.fluentcpp.com/2018/12/28/timer-cpp/

但它们都开始了一个新的线索。


共2个答案

匿名用户

有三种主要的方法可以让你等待一段时间:

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

你似乎不想要前两种方法。 这只会让主线程运行,在某处节省启动时间,并非常定期地调用一个函数:IsitTimeToCallMyFunction(),例如在主循环中。

这将是非常不雅观的,而且如果主线程中发生了一些冗长的事情,它仍然会使您面临函数调用不够快的问题。

所以,实际上,你的答案是“不”。 编辑:问题被更改为“如何”,因此答案变成了“通过使用上述三种方法之一”。

匿名用户

比方说,您想要并发,但不想要线程。 您也不希望阻塞主线程。

那么答案就远不止于此了。 您需要时间片的协同处理+手动管理。

我认为在两个并发任务之间手动操作并不是一个好主意。 所以我建议你了解一下Coroutines。 C++正在将它合并到标准中,但这仍然不是所有主流编译器或库都完全支持的。 您可以求助于某个第三方库。

然而,为什么不使用线程呢?

编辑:

对不起,我没有仔细阅读。 现在我想你想要的是一个计时器,用来“中断”你当前的任务--也就是当指定的时间已经过去时给你报警。

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

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|定时器|主|机上|块|运行|c++11)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?