如何将 glib 信号回调附加到特定线程上下文
how to attach glib signal callbacks to certain thread context
所以基本上我是按照步骤编写代码来创建基于 dbus 的应用程序。
1. g_bus_watch_name(出现特定服务的回调)
2. g_signal_connect 附加到服务提供的某些信号。
g_signal_connect(代理,"xyz",G_CALLBACK(回调), NULL);
我希望在某些线程上下文中 "callback" 到 运行。
如有任何提示,我们将不胜感激
来自the GDBusProxy
documentation:
A GDBusProxy instance can be used from multiple threads but note that
all signals (e.g. “g-signal”, “g-properties-changed” and “notify”) are
emitted in the thread-default main context of the thread where the
instance was constructed.
因此请确保 GMainContext
you want the signals to be emitted in is the thread-default at the time you create the GDBusProxy
. The typical pattern is to call g_main_context_push_thread_default()
在线程函数的开头,然后创建 GDBusProxy
并将信号连接到它,并将对象完全保留在该线程中。
有关使用 GMainContext
的推荐模式的详细信息,请参阅 the tutorial。特别是,它建议每个线程(该线程的默认值)有一个 GMainContext
,并且不要在线程之间移动它们。虽然支持,但在线程之间移动上下文很慢(由于锁定)并且使得其余代码的控制流和线程安全性很难推理。
所以基本上我是按照步骤编写代码来创建基于 dbus 的应用程序。 1. g_bus_watch_name(出现特定服务的回调) 2. g_signal_connect 附加到服务提供的某些信号。 g_signal_connect(代理,"xyz",G_CALLBACK(回调), NULL);
我希望在某些线程上下文中 "callback" 到 运行。
如有任何提示,我们将不胜感激
来自the GDBusProxy
documentation:
A GDBusProxy instance can be used from multiple threads but note that all signals (e.g. “g-signal”, “g-properties-changed” and “notify”) are emitted in the thread-default main context of the thread where the instance was constructed.
因此请确保 GMainContext
you want the signals to be emitted in is the thread-default at the time you create the GDBusProxy
. The typical pattern is to call g_main_context_push_thread_default()
在线程函数的开头,然后创建 GDBusProxy
并将信号连接到它,并将对象完全保留在该线程中。
有关使用 GMainContext
的推荐模式的详细信息,请参阅 the tutorial。特别是,它建议每个线程(该线程的默认值)有一个 GMainContext
,并且不要在线程之间移动它们。虽然支持,但在线程之间移动上下文很慢(由于锁定)并且使得其余代码的控制流和线程安全性很难推理。