信号

GioCancellable::cancelled

声明

void
cancelled (
  GCancellable* self,
  gpointer user_data
)

描述 [源代码]

当操作被取消时发出。

可取消的操作的实现可以使用此信号。如果操作在另一个线程中被取消,则信号将在取消操作的线程中发出,而不是在运行操作的线程中发出。

请注意,在多线程程序中从信号断开连接(或任何信号)可能导致竞争条件。例如,即使调用 g_signal_handler_disconnect() 已返回,也可能触发信号处理程序。

如果在连接到信号之前发生取消操作,也存在问题。如果发生这种情况,则信号将不会意外地发出,并且在连接到信号之前进行检查会留下一种竞争条件,其中这种情况仍在发生。

为了使其安全且易于连接处理程序,有两个辅助函数:`g_cancellable_connect()` 和 `g_cancellable_disconnect()`,它们可以防止此类问题。

如何使用此示例

    // Make sure we don't do unnecessary work if already cancelled
    if (g_cancellable_set_error_if_cancelled (cancellable, error))
      return;

    // Set up all the data needed to be able to handle cancellation
    // of the operation
    my_data = my_data_new (...);

    id = 0;
    if (cancellable)
      id = g_cancellable_connect (cancellable,
                      G_CALLBACK (cancelled_handler)
                      data, NULL);

    // cancellable operation here...

    g_cancellable_disconnect (cancellable, id);

    // cancelled_handler is never called after this, it is now safe
    // to free the data
    my_data_free (my_data);

请注意,已取消的信号是在用户取消的线程中发出的,这可能是主线程。因此,可取消的信号不应执行可能阻塞的操作。

默认处理程序

默认处理程序是在通过 g_signal_connect() 添加的处理程序之后调用的。