C Glib:DBUS属性中的NULL

C Glib:DBUS属性中的NULL,c,linux,glib,dbus,gio,C,Linux,Glib,Dbus,Gio,我正在使用gdbus codegen为DBUS客户端生成代码。 我在第三方DBUS服务器中具有GVariant属性 调用自动生成的方法以获取属性值时: GVariant* data = interface_name_get_some_property(proxy); 有时数据为空。自动生成的代码中的注释说明: 返回:transfer none:属性值,如果未设置属性,则返回%NULL。不要释放返回值,它属于@object 什么是未设置的方法?我应该如何处理这种情况? 我认为默认情况下,如果未设

我正在使用gdbus codegen为DBUS客户端生成代码。 我在第三方DBUS服务器中具有GVariant属性

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

GVariant* data = interface_name_get_some_property(proxy);
有时数据为空。自动生成的代码中的注释说明:

返回:transfer none:属性值,如果未设置属性,则返回%NULL。不要释放返回值,它属于@object

什么是未设置的方法?我应该如何处理这种情况? 我认为默认情况下,如果未设置选项G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,glib将加载所有属性,并且它们都应该被设置。

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

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

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服务器时,这种情况从未发生过。此外,我在创建代理很久之后请求属性值。