【问题标题】:Thread-friendly main loop for GTK and nanomsgGTK 和 nanomsg 的线程友好主循环
【发布时间】:2015-05-13 19:20:30
【问题描述】:

如何编写一个在等待来自多个来源的消息时阻塞的主循环? As I understand it,编写事件处理循环的首选方法是让它在等待事件时阻塞。

但是,当消息可能来自多个来源时,如何正确处理阻塞?

我想编写一个 GTK GUI,它既响应用户输入事件又响应通过 nanomsg 发送的消息。

GTK 允许通过调用gtk_main() 或以非阻塞方式使用gtk_main_iteration_do (FALSE) 来处理其事件。

Nanomsg 可以在阻塞或非阻塞模式下receive a message,以及poll for messages

是否有可能以某种方式阻止,直到哪个源首先输入可用的“解除阻止”? IE。是否有替代使用 sleep 的替代方法,它仍然响应所有事件?

【问题讨论】:

  • 不幸的是,GTK+ 必须完全存在于一个线程中。我不知道 nanomsg 是否有办法将自己与 GLib 集成(而 Google 没有帮助),但作为替代方案,您可以在另一个线程上运行 nanomsg 并使用 g_add_idle()gdk_threads_add_idle() (两者之一;我忘记了哪个更好)在 UI 线程上安排你的 UI 更新。
  • @andlabs 我认为这行不通。如果传递的函数阻塞,是不是会阻塞用户输入事件?如果它没有阻塞,它是不是会循环导致 CPU 使用率很高,或者调用的频率不足以立即获得输入? ntd 的回答看起来更有希望。
  • 在另一个线程上运行 nanomsg 不会阻塞用户输入事件;这些都由 GTK+ 线程处理。 idle_add() 安排一个函数在没有待处理的输入事件时运行;您可以使用它来更新 UI 以响应 nanomsg 收到的消息(但实际上不要在这里进行消息处理,否则会发生您所说的情况)。

标签: multithreading user-interface event-handling gtk nanomsg


【解决方案1】:

只要修改 UI 的任何调用都发生在 GTK+ 主循环中,您就可以在 GTK+ 应用程序中拥有任意数量的线程(并且不必强制使用 GMainLoop 实例)。

this answer 中,我提供了一个示例,其中有 100 个线程更新相同的用户界面。

最后,您可以在自己的线程中分叉并使用您更熟悉的任何内容(无论是轮询、阻塞或其他),并且仅在需要通知时才小心(即修改 UI)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-02
    • 2011-11-16
    • 2019-03-21
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多