类
Γιό简单异步结果
描述 [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()
并传入一个用于操作的 GSimpleAsyncResult
和 FALSE
来使异步操作忽略取消事件。对于一些危险的取消操作,例如关闭(在执行前取消会导致泄漏),这非常有用。
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()
,分别将操作的结果设置为 gpointer
、gboolean
或 gssize
。
同样,要获取异步函数的结果,提供了 g_simple_async_result_get_op_res_gpointer()
、g_simple_async_result_get_op_res_gboolean()
和 g_simple_async_result_get_op_res_gssize()
,分别获得操作的结果为一个 gpointer
、gboolean
和 gssize
。
有关实现必须遵守的要求的详细信息,请参阅 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_take_error
从一个错误条件创建一个 GSimpleAsyncResult
,并接管调用者对 error
的所有权,因此调用者不再需要释放它。
已弃用:2.46 自 2.28
实例方法
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_run_in_thread
在单独的线程中运行异步作业,然后在simple上调用g_simple_async_result_complete_in_idle()以将结果返回到适当的主循环。
已弃用:2.46
g_simple_async_result_set_error_va
在不使用GError的情况下在异步结果中设置错误。除非编写绑定,否则请参阅g_simple_async_result_set_error()。
已弃用:2.46
从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信号。