适用于GTK和nanomsg的线程友好型主循环

3
我该如何编写一个主循环,以阻塞等待来自多个来源的消息?据我所知,编写事件处理循环的首选方式是在等待事件时进行阻塞。
然而,当消息可能来自多个来源时,如何正确处理阻塞?
我想编写一个响应用户输入事件和通过nanomsg发送的消息的GTK GUI。
GTK允许通过调用gtk_main()或以非阻塞方式gtk_main_iteration_do(FALSE)来处理其事件。

Nanomsg可以以阻塞或非阻塞模式接收消息,也可以轮询消息

是否可能在任何一个输入源有可用输入时“阻塞”,直到“解除阻塞”?即,是否有一种替代使用sleep仍对所有事件保持响应的方法?


不幸的是,GTK+ 必须完全存在于一个线程中。我不知道 nanomsg 是否有一种方法将自己与 GLib 集成(Google 也没有帮助),但作为一种替代方案,您可以在另一个线程上运行 nanomsg,并使用 g_add_idle()gdk_threads_add_idle()(其中之一;我忘记哪个更好了)在 UI 线程上安排您的 UI 更新。 - andlabs
@andlabs,我认为那样做行不通。如果传递的函数被阻塞,那么它会阻塞用户输入事件吗?如果它不阻塞,那么它会循环引起高CPU使用率,否则不会被频繁调用以立即获取输入。ntd的答案看起来更有前途。 - dhardy
在另一个线程上运行nanomsg不会阻塞用户输入事件;所有这些事件都由GTK+线程处理。idle_add()函数会在没有待处理的输入事件时安排要运行的函数;您可以使用它来响应通过nanomsg接收到的消息更新UI(但不要在此处实际执行消息处理,否则会发生您所说的情况)。 - andlabs
1个回答

3
你可以在GTK+应用程序中拥有任意数量的线程(不必使用GMainLoop实例),只要修改UI的任何调用都发生在主GTK+循环中。
这个答案中,我提供了一个使用100个线程更新相同用户界面的示例。
最后,你可以分叉并在自己的线程中使用你更熟悉的任何内容(无论是轮询、阻塞还是其他什么),只有在需要通知(即修改UI)时才要小心。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接