我在哪里/如何获得一个Looper?

时间:2012-10-06 12:39:57

标签: c++ looper

根据C ++标准或C ++标准库,我在哪里/如何获得Looper?

我需要设计自己的回调系统,当然,我需要这个来管理我的队列和我的组件。

一个looper是给定频率做一件简单的事情,它只是在每个时钟运行一个队列,如果你设置一个10毫秒的弯针,每10ms looper将触发队列中的事件/事件。

这基本上是一个looper,大部分时间通常都与内核,硬件时钟或某些真正低级别的内容有关。

2 个答案:

答案 0 :(得分:2)

您可以使用新C ++ 11标准中的一些原语来创建这样的东西。 使用std::threadstd::timed_mutex来控制std::queue的循环读数。 将functor类放入队列中。从线程循环中执行仿函数。

你也可以反过来推动仿函数对象'向上'以恒定频率排队并从“客户端”执行它们。侧。

不知何故,它归结为有一个时间控制访问来自' Looper'线。你可以用例如std::thread::sleep_for()执行此操作,或使用一些更复杂的机制,其行为类似于定时信号量(例如,条件变量与std::timed_mutex相结合)。

答案 1 :(得分:1)

QTimer做你想要的 - “单发”,或者在你的情况下,以给定(毫秒)的频率重复发射。

你也可能谷歌为“看门狗计时器”,因为我认为这可能是一个比“looper”更常见的术语。

如果你想更低级别,一些系统(如Windows)有一个“系统时钟”(通常是毫秒级分辨率),另一个更高性能的时钟,如“多媒体时钟”(通常如果性能很重要,则在纳秒分辨率下。

[编辑] ,好的,所以我看了一个关于“什么是动摇”的视频。这看起来像标准的事件处理队列。 GUI事件触发添加到队列的消息,“looper”定期清除/执行消息队列。一个特例是“looper”还处理“本地服务呼叫”(在Android上,这是视频的主题)。所以,你似乎只需要:

  • 消息队列
  • 清除消息队列的计时器(在线程上,或与“主处理”分开)

视频说明:

  • 视图使用Looper消息来触发事件
  • 由于Loopers与线程的比例为1:1,因此View树太
  • 您创建的主题无法直接触及视图
  • 但是,您可以为自己的线程创建一个新的Looper

所以,有趣的是,但看起来并不特别难以实现。这是一个良好的胎面模式。

因此,在这种情况下,我对QTimer的建议只是解决方案的一部分。听起来好像你希望消息队列的库可以随它一起使用。