信号
GioCancellable::cancelled
描述 [源代码]
当操作被取消时发出。
可取消的操作的实现可以使用此信号。如果操作在另一个线程中被取消,则信号将在取消操作的线程中发出,而不是在运行操作的线程中发出。
请注意,在多线程程序中从信号断开连接(或任何信号)可能导致竞争条件。例如,即使调用 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);
请注意,已取消的信号是在用户取消的线程中发出的,这可能是主线程。因此,可取消的信号不应执行可能阻塞的操作。
默认处理程序 默认处理程序是在通过 |