Γιό简单异步结果

描述 [src]

final class Gio.SimpleAsyncResult : GObject.Object
  implements Gio.AsyncResult {
  /* No available fields */
}

从 GLib 2.46 开始,GSimpleAsyncResult 已被废弃,改用 GTask,后者提供更简单的 API

GSimpleAsyncResult 实现了 GAsyncResult

GSimpleAsyncResult 处理 GAsyncReadyCallback(异步准备回调)、错误报告、操作取消和操作的最后状态,对应用程序完全透明。结果可以作为指针返回,例如对于返回异步收集数据的函数,可以返回布尔值以检查操作的成功或失败,或返回 gssize 以供需要返回操作的字节数的操作使用;简单返回的所有情况都得到覆盖。

大多数时候,应用程序不需要了解此 API 的详细信息;它是透明处理的,并且所有必要的操作都通过 GAsyncResult 的接口处理。但是,如果实现新的 GIO 模块、编写语言绑定或需要更好地控制异步操作完成方式的复杂应用程序,了解这些功能非常重要。

使用标签标记 GSimpleAsyncResult 以确保异步函数及其完成函数被正确一起使用。

要创建一个新的 GSimpleAsyncResult,请调用 g_simple_async_result_new()。如果结果需要创建用于 GError,请使用 g_simple_async_result_new_from_error()g_simple_async_result_new_take_error()。如果不可用 GError(例如异步操作不需要 GError 参数),但仍然需要创建用于错误条件的结果,请使用 g_simple_async_result_new_error()(或者如果您需要传递一个可变参数列表,请使用 g_simple_async_result_set_error_va()),然后可以通过使用 g_simple_async_result_propagate_error() 来传播错误。

可以通过调用 g_simple_async_result_set_handle_cancellation() 并传入一个用于操作的 GSimpleAsyncResultFALSE 来使异步操作忽略取消事件。对于一些危险的取消操作,例如关闭(在执行前取消会导致泄漏),这非常有用。

GSimpleAsyncResult 可以集成到 GLib 的事件循环(GMainLoop)或使用 GThread。通过调用 g_simple_async_result_complete(),可以直接从一个点完成 I/O 任务。而通过调用 g_simple_async_result_complete_in_idle(),将在线程的默认主要上下文中的空闲处理程序中完成它(参见 g_main_context_push_thread_default()),其中创建了一个 GSimpleAsyncResult。通过调用 g_simple_async_result_run_in_thread(),将在单独的线程中运行工作,然后使用 g_simple_async_result_complete_in_idle() 交付结果。

要设置异步函数的结果,提供了 g_simple_async_result_set_op_res_gpointer()g_simple_async_result_set_op_res_gboolean()g_simple_async_result_set_op_res_gssize(),分别将操作的结果设置为 gpointergbooleangssize

同样,要获取异步函数的结果,提供了 g_simple_async_result_get_op_res_gpointer()g_simple_async_result_get_op_res_gboolean()g_simple_async_result_get_op_res_gssize(),分别获得操作的结果为一个 gpointergbooleangssize

有关实现必须遵守的要求的详细信息,请参阅 GAsyncResult。使用 GSimpleAsyncResult 的异步操作的典型实现如下所示

static void
baked_cb (Cake    *cake,
          gpointer user_data)
{
  // In this example, this callback is not given a reference to the cake,
  // so the GSimpleAsyncResult has to take a reference to it.
  GSimpleAsyncResult *result = user_data;

  if (cake == NULL)
    g_simple_async_result_set_error (result,
                                     BAKER_ERRORS,
                                     BAKER_ERROR_NO_FLOUR,
                                     "Go to the supermarket");
  else
    g_simple_async_result_set_op_res_gpointer (result,
                                               g_object_ref (cake),
                                               g_object_unref);


  // In this example, we assume that baked_cb is called as a callback from
  // the mainloop, so it's safe to complete the operation synchronously here.
  // If, however, _baker_prepare_cake () might call its callback without
  // first returning to the mainloop — inadvisable, but some APIs do so —
  // we would need to use g_simple_async_result_complete_in_idle().
  g_simple_async_result_complete (result);
  g_object_unref (result);
}

void
baker_bake_cake_async (Baker              *self,
                       guint               radius,
                       GAsyncReadyCallback callback,
                       gpointer            user_data)
{
  GSimpleAsyncResult *simple;
  Cake               *cake;

  if (radius < 3)
    {
      g_simple_async_report_error_in_idle (G_OBJECT (self),
                                           callback,
                                           user_data,
                                           BAKER_ERRORS,
                                           BAKER_ERROR_TOO_SMALL,
                                           "%ucm radius cakes are silly",
                                           radius);
      return;
    }

  simple = g_simple_async_result_new (G_OBJECT (self),
                                      callback,
                                      user_data,
                                      baker_bake_cake_async);
  cake = _baker_get_cached_cake (self, radius);

  if (cake != NULL)
    {
      g_simple_async_result_set_op_res_gpointer (simple,
                                                 g_object_ref (cake),
                                                 g_object_unref);
      g_simple_async_result_complete_in_idle (simple);
      g_object_unref (simple);
      // Drop the reference returned by _baker_get_cached_cake();
      // the GSimpleAsyncResult has taken its own reference.
      g_object_unref (cake);
      return;
    }

  _baker_prepare_cake (self, radius, baked_cb, simple);
}

Cake *
baker_bake_cake_finish (Baker        *self,
                        GAsyncResult *result,
                        GError      **error)
{
  GSimpleAsyncResult *simple;
  Cake               *cake;

  g_return_val_if_fail (g_simple_async_result_is_valid (result,
                                                        G_OBJECT (self),
                                                        baker_bake_cake_async),
                        NULL);

  simple = (GSimpleAsyncResult *) result;

  if (g_simple_async_result_propagate_error (simple, error))
    return NULL;

  cake = CAKE (g_simple_async_result_get_op_res_gpointer (simple));
  return g_object_ref (cake);
}

祖先

实现

构造函数

g_simple_async_result_new

创建一个 GSimpleAsyncResult

已弃用:2.46 

g_simple_async_result_new_error

创建一个具有设置的 GSimpleAsyncResult 错误。

已弃用:2.46 

g_simple_async_result_new_from_error

从一个错误条件创建一个 GSimpleAsyncResult

已弃用:2.46 

g_simple_async_result_new_take_error

从一个错误条件创建一个 GSimpleAsyncResult,并接管调用者对 error 的所有权,因此调用者不再需要释放它。

已弃用:2.46 自 2.28

函数

g_simple_async_result_is_valid

确保传递给异步操作 _finish 函数的数据是一致的。进行了三次检查。

已弃用:2.46 自 2.20

实例方法

g_simple_async_result_complete

立即完成异步I/O作业。必须在异步结果要交付的线程中调用,因为它会直接调用回调。如果您在另一个线程中,请使用g_simple_async_result_complete_in_idle()。

已弃用:2.46 

g_simple_async_result_complete_in_idle

在创建simple的线程的[thread-default main context][g-main-context-push-thread-default]中的空闲处理程序中完成异步函数,并在回调调用期间重新推入该上下文。

已弃用:2.46 

g_simple_async_result_get_op_res_gboolean

从异步结果中获取操作结果的布尔值。

已弃用:2.46 

g_simple_async_result_get_op_res_gpointer

获取异步函数返回的指针结果。

已弃用:2.46 

g_simple_async_result_get_op_res_gssize

从异步结果中获取gssize。

已弃用:2.46 

g_simple_async_result_get_source_tag

获取GSimpleAsyncResult的源标签。

已废弃:2.46。 

g_simple_async_result_propagate_error

将简单异步结果中的错误传播到指定的目的地。

已弃用:2.46 

g_simple_async_result_run_in_thread

在单独的线程中运行异步作业,然后在simple上调用g_simple_async_result_complete_in_idle()以将结果返回到适当的主循环。

已弃用:2.46 

g_simple_async_result_set_check_cancellable

在分发结果之前设置GCancellable以检查。

已废弃:2.46 自2.32起可用

g_simple_async_result_set_error

在不使用GError的情况下在异步结果中设置错误。

已弃用:2.46 

g_simple_async_result_set_error_va

在不使用GError的情况下在异步结果中设置错误。除非编写绑定,否则请参阅g_simple_async_result_set_error()。

已弃用:2.46 

g_simple_async_result_set_from_error

从GError设置结果。

已弃用:2.46 

g_simple_async_result_set_handle_cancellation

设置是否在异步操作中处理取消。

已弃用:2.46 

g_simple_async_result_set_op_res_gboolean

在异步结果中设置操作结果为布尔值。

已弃用:2.46 

g_simple_async_result_set_op_res_gpointer

在异步结果中将操作结果设置为指针。

已弃用:2.46 

g_simple_async_result_set_op_res_gssize

在异步结果中将操作结果设置为给定的op_res。

已弃用:2.46 

g_simple_async_result_take_error

从error设置结果,并接管调用者的error的所有权,因此调用者不再需要释放它。

已弃用:2.46 自 2.28

GObject继承的方法(43)

请参阅GObject获取方法的完整列表。

GAsyncResult继承的方法(4)
g_async_result_get_source_object

从GAsyncResult中获取源对象。

g_async_result_get_user_data

从GAsyncResult中获取用户数据。

g_async_result_is_tagged

检查res是否具有给定的source_tag(通常是一个函数指针,指示res是由该函数创建的)。

since: 2.34

g_async_result_legacy_propagate_error

如果res是GSimpleAsyncResult,则此操作等同于g_simple_async_result_propagate_error()。否则它返回FALSE。

since: 2.34

信号

GObject继承的信号(1)
GObject::notify

当使用g_object_set_property(),g_object_set()等设置对象的一个属性值时,会发出notify信号。

类结构

struct GioSimpleAsyncResultClass {
  /* no available fields */
}

没有可用的说明。