在通过gdbus触发代理呼叫之前,我想在此dbus方法上取消任何可能的挂起呼叫。我的第一次尝试是这样的:
// in the "member" list of my widget
GCancellable *my_cancellable;
// in the init method of my widget:
plugin->my_cancellable = g_cancellable_new ();
// in the method which does the call
g_cancellable_cancel (plugin->my_cancellable);
my_gdbus_call_something (plugin->proxy, plugin->my_cancellable, reply_handler,plugin);
这没有用,因为使用相同的可取消实例也将取消任何将来的通话。 看起来我无法使用g_cancellable_reset,因为doc stats如下:
如果任何可取消的操作当前正在使用可取消的话 此函数的行为未定义。
是否可以检查我的GCancellable的使用状态?它会对我有帮助吗?
对我来说已经很好用的是为每个电话创建一个新的可取消:
// in the "member" list of my widget
GCancellable *my_cancellable;
// in the init method of my widget:
plugin->my_cancellable = NULL;
// in the method which does the call
if(plugin->my_cancellable != NULL)
{
g_cancellable_cancel (plugin->my_cancellable);
g_object_unref (plugin->my_cancellable);
}
plugin->my_cancellable = g_cancellable_new ();
my_gdbus_call_something (plugin->proxy, plugin->my_cancellable, reply_handler,plugin);
是否保存到unref my_cancellable,认为有未决电话?这必须是一个标准的用例..我想知道是否没有更好的解决方案。
答案 0 :(得分:0)
我的第一次编码尝试几乎没问题......我刚刚没有意识到取消时它已经被“取消”,当它被取消时,所以在调用g_cancellable_cancel后可以安全地调用{{3} }}
感谢JoséFonte指出这一点!
这里是固定代码:
// in the "member" list of my widget
GCancellable *my_cancellable;
// in the init method of my widget:
plugin->my_cancellable = g_cancellable_new ();
// in the method which does the call
g_cancellable_cancel (plugin->my_cancellable);
g_cancellable_reset (plugin->my_cancellable);
my_gdbus_call_something (plugin->proxy, plugin->my_cancellable, reply_handler,plugin);