当前位置: 首页 > news >正文

西安必途网站建设培训中心电子网站建设前台设计

西安必途网站建设培训中心,电子网站建设前台设计,wordpress 表格小工具,网站编辑心得体会GTask表示管理一个可取消的“任务task” GCancellable GCancellable是一个线程安全的操作取消栈#xff0c;用于整个GIO#xff0c;以允许取消同步和异步操作。 它继承于GObject对象#xff0c;不是一个单纯的结构体 相关函数 g_task_new GTask* g_task_new (GObject*…GTask表示管理一个可取消的“任务task” GCancellable GCancellable是一个线程安全的操作取消栈用于整个GIO以允许取消同步和异步操作。 它继承于GObject对象不是一个单纯的结构体 相关函数 g_task_new GTask* g_task_new (GObject* source_object,GCancellable* cancellable,GAsyncReadyCallback callback,gpointer callback_data )创建一个作用于source_object的GTask它最终会在[thread-default main context][g-main-context-push-thread-default]中被使用去调用callback 在异步方法的“start”方法中调用它并在异步操作中传递GTask。可以使用g_task_set_task_data()将特定于任务的数据附加到对象上稍后可以通过g_task_get_task_data()获取这些数据。 默认情况下如果cancelable被取消那么任务的返回值总是G_IO_ERROR_CANCELLED即使任务在取消之前已经完成。取消操作可能意味着该任务所依赖的其他对象已经被销毁这种情况下的处理可以简化。如果你不想要这种行为可以使用g_task_set_check_cancellable()来改变它。 g_task_set_task_data void g_task_set_task_data (GTask* task,gpointer task_data,GDestroyNotify task_data_destroy )设定task任务的数据 g_task_run_in_thread void g_task_run_in_thread (GTask* task,GTaskThreadFunc task_func )在另一个线程中运行task_func。当task_func返回时任务的GAsyncReadyCallback将在任务的GMainContext中调用任务实在那个GMainContext上下文中创建的就那个上下文中执行回调函数。 这里会对task进行一个ref直到task完成。 有关如何处理task_func的更多细节请参阅GTaskThreadFunc。 尽管GLib当前对通过g_task_run_in_thread()排队的任务进行速率限制但大家不应该假定它总是这样做。如果你有很多任务要运行(几十个任务)但又不希望它们同时运行那么一次只应该将有限数量的任务(大约10个)放入队列。 #include glib.h #include glib-object.h #include gio/gio.h #include stdio.h #include stdlib.htypedef int CakeFlavor; typedef int CakeFrostingType;typedef struct {guint radius; /* 蛋糕半径 */CakeFlavor flavor; /* 蛋糕风味 */CakeFrostingType frosting; /* 蛋糕糖霜类型 */char *message; } CakeData;typedef GObject Cake; typedef GObject Baker; /* 面包师 */static void cake_data_free (CakeData *cake_data) {g_print (%p: %s\n, g_thread_self(), __func__);g_free (cake_data-message);/* */g_slice_free (CakeData, cake_data); }/* 烤面包 */ static Cake * bake_cake(Baker *self, guint radius, CakeFlavor flavor,CakeFrostingType frosting, char *message,GCancellable *cancellable, GError **error) {printf(%p: %s\n, g_thread_self(), __func__);return g_object_new(G_TYPE_OBJECT, NULL); }static void bake_cake_thread(GTask *task, gpointer source_object,gpointer task_data, GCancellable *cancellable) {Baker *self source_object;CakeData *cake_data task_data;Cake *cake;GError *error NULL;printf(%p: %s\n, g_thread_self(), __func__);cake bake_cake(self, cake_data-radius, cake_data-flavor,cake_data-frosting, cake_data-message, cancellable,error);if (cake)g_task_return_pointer(task, cake, g_object_unref);elseg_task_return_error(task, error); }static void baker_bake_cake_async(Baker *self, guint radius, CakeFlavor flavor,CakeFrostingType frosting,const char *message,GCancellable *cancellable,GAsyncReadyCallback callback,gpointer user_data) {CakeData *cake_data;GTask *task;printf(%p: %s\n, g_thread_self(), __func__);/* 切片分配内存这是一个便利的宏从slice allocator分配内存 */cake_data g_slice_new(CakeData);cake_data-radius radius;cake_data-flavor flavor;cake_data-frosting frosting;cake_data-message g_strdup(message);task g_task_new(self, cancellable, callback, user_data);/* 把数据附加在task上 */g_task_set_task_data(task, cake_data, (GDestroyNotify)cake_data_free);g_task_run_in_thread(task, bake_cake_thread);g_object_unref(task); }static Cake * baker_bake_cake_finish(Baker *self, GAsyncResult *res,GError **error) {g_return_val_if_fail(g_task_is_valid(res, self), NULL);printf(%p: %s\n, g_thread_self(), __func__);return g_task_propagate_pointer(G_TASK(res), error); }static void my_callback(GObject *source_object, GAsyncResult *res,gpointer user_data) {/* 创建一个面包师 */Baker *baker (Baker *)source_object;GMainLoop *loop (GMainLoop *)user_data;Cake *cake;GError *error NULL;printf(%p: %s\n, g_thread_self(), __func__);cake baker_bake_cake_finish(baker, res, error);printf(A cake is baked: %p\n, cake);// But discard it. I prefer pudding.g_object_unref(cake);// Stop cooking.g_main_loop_quit(loop); }int main(void) {Baker *baker g_object_new(G_TYPE_OBJECT, NULL);GCancellable *cancellable g_cancellable_new();GMainLoop *loop g_main_loop_new(NULL, FALSE);printf(%p: %s\n, g_thread_self(), __func__);baker_bake_cake_async(baker, 10, 20, 30, emit, cancellable,1, loop);g_object_unref(cancellable);printf(%p: start event loop.\n, g_thread_self());g_main_loop_run(loop);g_main_loop_unref(loop);g_object_unref(baker);return EXIT_SUCCESS; }异步操作 GTask最常见的用法是作为一个GAsyncResult在异步操作期间管理数据。你可以在“start”方法中调用g_task_new()然后调用g_task_set_task_data()以及类似的方法如果你需要保留一些与任务相关的额外数据然后通过异步操作传递任务对象。最终您将调用诸如g_task_return_pointer()或g_task_return_error()之类的方法该方法将保存您给它的值然后在创建它的[thread-default main context][g-main-context-push-thread-default]中调用任务的回调函数(如果需要首先等待主循环的下一次迭代)。调用者将把GTask传递回操作的finish函数(作为GAsyncResult)你可以使用g_task_propagate_pointer()或类似的函数来提取返回值。 使用GTask要求thread-default的GMainContext从GTask构建时开始运行至少直到任务完成并释放其数据。 下面是一个使用GTask作为GAsyncResult的例子:
http://www.hkea.cn/news/14327481/

相关文章:

  • 织梦网站主页hdmi高清wifi无线传输器
  • 京东网站推广方式wordpress调用错误模板的原因
  • 恩施哪里有做网站的网络推广优化能有排名吗
  • 黄岛网站建设价格有哪些游戏可以做网站
  • 如何维护建设网站做网站自己能做百度推广吗
  • dnf游戏币交易网站建设苏州做网站知识的分享
  • 网站建设与维护中wordpress禁止抓取分页
  • 网站建设网站开发dedecms 网站安装
  • 如何建一个免费网站用一个口罩做一把枪
  • 成都网站优化中原区网站建设
  • 网站建设公司工资设置wordpress健康主题
  • 网站建设流程渠道h5如何做网站
  • 大兴专业网站建设公司北京石景山私人影院哪里有
  • 互联网站备案信息查询爱彩人网站怎么做
  • 免费网站可以做cpa?网站好坏的指标
  • 手机如何网站大鹏教育平面设计官网
  • 做一个营销型网站南京网站建设公司开发
  • 做学校后台网站网站的模板怎么做
  • 门户网站建设背景宁波做网站烟台厂商
  • 做网站怎么弄用asp做网站怎么布局
  • 运城市住房和城乡建设局网站企业做网站400电话作用
  • 做网站这么做优享揭阳网站建设
  • jsp商务网站建设找网络公司做网站要注意这4个细节
  • 无锡网站开发定制开发wordpress lamp
  • 著名建筑网站手机网站设计公司可去亿企邦
  • 怎么建立博客网站wordpress装修
  • 个人如何建设网站猎聘网招聘网页版
  • 东门网站建设网站佣金怎么做会计分录
  • 域名解析错误无法上网搜外seo视频 网络营销免费视频课程
  • 文字网站居中基于 wordpress