可以重用我的GCancellable实例吗?

时间:2018-01-20 09:46:18

标签: c gtk3 glib gdbus

在通过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,认为有未决电话?这必须是一个标准的用例..我想知道是否没有更好的解决方案。

1 个答案:

答案 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);