【问题标题】:Where/how I can get a Looper? [closed]我在哪里/如何获得 Looper? [关闭]
【发布时间】:2012-10-06 21:23:48
【问题描述】:

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

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

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

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

【问题讨论】:

  • 什么是“Looper”?这是书还是什么的?请需要更多上下文...
  • @tenfour 我猜 OP 的意思类似于 STL 容器上的 for_each 操作。 OP 的问题,为什么不只使用一种 STL 函数方法?
  • @axis:再想想吧。这不是 C++ 的工作方式。程序具有精确的控制流概念。事情不仅仅发生在此之外。烤面包机基本上只是一个大的sleep 声明,但请注意烤面包机在烤面包时是如何没有做任何其他事情
  • @Axis:对你来说它可能有一个单一的含义,但它不是一个标准或通用的。老实说,我之前唯一一次听到这个词是俚语,指的是某种特定类型的快乐药丸。从来没有在技术背景下。制作那个视频的人可能想要看起来很酷
  • @axis:首先点击谷歌Looper。可能很清楚,但没有多大帮助:p

标签: c++ looper


【解决方案1】:

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

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

归结为从“Looper”线程对队列进行时间控制的访问。您可以使用例如std::thread::sleep_for() 来做到这一点,或者使用一些更复杂的机制,其行为类似于定时信号量(例如,与 std::timed_mutex 结合的条件变量)。

【讨论】:

    【解决方案2】:

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

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

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

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

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

    视频笔记:

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

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

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

    【讨论】:

    • 这与OP对“根据C++标准或C++标准库”的要求不太匹配
    • "watch-dog-timer" ...这是什么词?顺便说一句,您似乎理解我的问题,但您的解决方案并不标准,我无法相信 C++ 不支持从头开始的回调或类似机制...
    • watch-dog-timer 有硬件历史。计时器定期“ping”以获得响应,如果没有响应,它会触发操作(如硬件板重置)。目标是从“主系统处理”中“最终独立”。它在软件中用于独立操作,例如“clearing-message-queues”。
    • @axis,C++ 通过 libraries 支持回调和类似的机制。您想编写或使用库。 C++11 添加了thread 库的标准。然而,“回调”和“消息队列”可能是高度特定于应用程序的,我们已经使用了几十年(大多数 GUI 库的基础),它们旨在处理特定的约束(例如,单或-多线程,高响应性等)此外,您想要的也可以通过仅使用进程间通信(IPC)来处理,它做同样的事情(许多进程只是将它们的消息转发给服务进程)
    猜你喜欢
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多