如何将 glib 信号回调附加到特定线程上下文

问题描述 投票:0回答:1

所以基本上我正在编写以下步骤来创建基于 dbus 的应用程序。 1. g_bus_watch_name(特定服务出现的回调) 2. g_signal_connect 附加到服务提供的某些信号。 g_signal_connect(代理,"xyz", G_CALLBACK(回调), NULL);

我希望“回调”在特定线程上下文下运行。

任何提示将不胜感激

glib dbus
1个回答
5
投票

来自

GDBusProxy
文档

GDBusProxy 实例可以在多个线程中使用,但请注意 所有信号(例如“g-signal”、“g-properties-changed”和“notify”) 在线程的线程默认主上下文中发出,其中 实例已构建。

因此,请确保您希望发出信号的

GMainContext
是您创建
GDBusProxy
时的线程默认值。典型的模式是在线程函数开始时调用
g_main_context_push_thread_default()
,然后创建
GDBusProxy
并将信号连接到它,并将对象完全保留在该线程内。

有关使用

GMainContext
的推荐模式的更多信息,请参阅教程。特别是,它建议每个线程有一个
GMainContext
(该线程的默认值),并且不要在线程之间移动它们。虽然受支持,但在线程之间移动上下文的速度很慢(由于锁定),并且使得其余代码的控制流和线程安全性很难推理。

© www.soinside.com 2019 - 2024. All rights reserved.