Glib:DBUS 属性中的 NULL

Posted

技术标签:

【中文标题】Glib:DBUS 属性中的 NULL【英文标题】:Glib: NULL in DBUS property 【发布时间】:2018-03-08 21:14:55 【问题描述】:

我正在使用gdbus-codegen 为 DBUS 客户端生成代码。 我在第三方 DBUS 服务器中有 GVariant 属性<property name="someProperty" type="(iiii)" access="read"/>

当我调用自动生成的方法获取属性值时:

GVariant* data = interface_name_get_some_property(proxy);

有时数据是NULL。自动生成代码中的注释状态:

返回:(无传输):属性值,如果未设置属性,则返回 %NULL。不要释放返回值,它属于@object。

“未设置”是什么意思,我应该如何处理这种情况? 我认为默认情况下(如果未设置选项 G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES)glib 会加载所有属性,并且都应该设置它们。

【问题讨论】:

【参考方案1】:

生成的代码使用g_dbus_proxy_get_cached_property(),它永远不会阻塞 I/O:如果属性由于任何原因不在缓存中,您将无法获得正确的值。一个常见的问题是在创建代理后立即获取属性值:g_dbus_proxy_new() 异步加载属性值,因此此时它们不应该可用。

处理属性的最佳方法是使用属性更改通知。在您的情况下,生成的 GObjects“通知”信号应该是最简单的方法:

void
on_some_property_notify (GObject    *proxy,
                         GParamSpec *pspec,
                         gpointer    user_data)

    GVariant* data = interface_name_get_some_property(proxy);
    // Do something with new prop value here


// TODO: check what the actual generated property name is
g_signal_connect (proxy, "notify::someProperty",
                  G_CALLBACK (on_some_property_notify), user_data);

【讨论】:

感谢您的回复。我几乎明白你在说什么。但这“任何理由”是什么?你能举个例子吗?当我实现 DBUS 服务器时,这永远不会发生。另外,我在创建代理后很久才请求属性值。

以上是关于Glib:DBUS 属性中的 NULL的主要内容,如果未能解决你的问题,请参考以下文章

linux 进程间通信 dbus-glib实例详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)

dbus-glib.h里面没有DBusConnection,只有DBusGConnection。

Dbus/GLib 主循环,后台线程

无法定位软件包dbus-glib-1

在 dbus-glib 服务器中传递数组

无法定位软件包dbus-glib-1