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

Posted

技术标签:

【中文标题】如何将 glib 信号回调附加到某些线程上下文【英文标题】:how to attach glib signal callbacks to certain thread context 【发布时间】:2018-10-05 20:14:48 【问题描述】:

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

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

任何提示将不胜感激

【问题讨论】:

【参考方案1】:

来自the GDBusProxy documentation:

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

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

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

【讨论】:

感谢菲利普的指导。

以上是关于如何将 glib 信号回调附加到某些线程上下文的主要内容,如果未能解决你的问题,请参考以下文章

Python 中的进程线程协程同步异步回调

我需要对 glib 信号参数执行 g_object_unref() 吗?

io_add_watch 回调只触发一次?

如何将对象上下文传递给 jQuery.ajax JSONP 回调?

如何将某些活动的上下文作为参数传递

将实体附加到数据上下文