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

时间:2018-04-25 11:10:56

标签: glib dbus

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

我希望“回调”在某些线程上下文中运行。

任何提示都将受到高度赞赏

1 个答案:

答案 0 :(得分:1)

来自the GDBusProxy documentation

  

可以从多个线程使用GDBusProxy实例但请注意   所有信号(例如“g信号”,“g-属性改变”和“通知”)都是   在线程的线程默认主要上下文中发出的   实例已经构建。

因此,请确保您希望发出信号的GMainContext是创建GDBusProxy时的线程默认值。典型的模式是在线程函数的开头调用g_main_context_push_thread_default(),然后创建GDBusProxy并将信号连接到它,并将对象完全保留在该线程中。

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