2017-09-27 17 views
0

私はgdbus-codegenを使用してDBUSクライアント用のコードを生成しています。Glib:DBUSプロパティのNULL

GVariant* data = interface_name_get_some_property(proxy); 

いくつかの倍のデータがNULLです: 私は<property name="someProperty" type="(iiii)" access="read"/>

私は、プロパティ値を取得するために自動生成メソッドを呼び出して、第三者DBUSサーバでGVariant性質を持っています。

戻り値:(転送なし):プロパティ値が設定されていない場合はNULL。返された値を解放しないでください。それは@objectに属します。

「設定しない」とはどういう意味ですか、この状況をどのように扱うべきですか? デフォルトでは(オプションG_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIESが設定されていない場合)、glibはすべてのプロパティをロードし、それらはすべて設定されるべきだと考えました。

答えて

1

生成されたコードは、ブロックI/Oを決して行わないg_dbus_proxy_get_cached_property()を使用します。何らかの理由でプロパティがキャッシュにない場合、正しい値を取得できません。よくある問題は、プロキシを作成した直後にプロパティ値をフェッチすることです。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サーバーを実装しているとき、これは決して起こりません。また、私は、プロキシが作成されてからずっとプロパティ値を要求しています。 –

関連する問題