2017-09-27 59 views
0

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

当我调用自动生成的方法来获得属性值GVariant属性:

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); 
+0

谢谢你的回复。我理解你所说的几乎全部。但是,这是“什么原因”?你能举个例子吗?当我实施DBUS服务器时,这种情况永远不会发生。此外,我在创建代理后很长时间请求属性值。 –