0

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

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

Looper 是给定频率做一件简单的事情的东西,它只是在每个时钟运行一个队列,如果您设置一个 10 ms 的 looper,则每 10 ms 循环器将触发队列中的事件/事件。

这基本上是一个循环器,大部分时间通常与内核、硬件时钟或一些非常低级的东西相关联。

4

2 回答 2

2

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

您也可以反之亦然,以恒定频率将函子对象“向上”推入队列并从“客户端”端执行它们。

不知何故,归结为从“Looper”线程对队列进行时间控制的访问。您可以使用 egstd::thread::sleep_for()来执行此操作,或者使用一些更复杂的机制,其行为类似于定时信号量(例如,与 a 耦合的条件变量std::timed_mutex)。

于 2012-10-06T13:04:18.277 回答
1

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

您也可以在谷歌上搜索“watch-dog-timer”,因为我认为这可能是比“looper”更常见的术语。

如果你想更底层,一些系统(如 Windows)有一个“系统时钟”(通常以毫秒分辨率),还有另一个更高性能的时钟,如“多媒体时钟”(通常以纳秒分辨率) 如果性能很重要。

[编辑],好的,所以我观看了关于“what-is-a-looper”的视频。这看起来像一个标准的事件处理队列。GUI 事件触发消息添加到队列,并且“循环器”定期清除/执行消息队列。一个特殊情况是“looper”还处理“local-service-calls”(在 Android 上,这是视频的主题)。因此,您似乎只需要:

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

视频注释:

  • 视图使用 Looper 消息来触发事件
  • 由于 Loopers 与线程是 1:1 的,因此 View 树也是
  • 您创建的线程不能直接接触视图
  • 但是,您可以为自己的线程创建一个新的 Looper

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

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

于 2012-10-06T12:52:44.700 回答