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

gtask笔记

1、创建Task
GTask *g_task_new (gpointer  source_object, GCancellable *cancellable, GAsyncReadyCallback  callback, gpointer callback_data);
source_object:GObject对象,拥有者
cancellable:可否取消
callback:task完成后调用函数
callback_data:task完成后调用函数数据参数
2、设置数据
void g_task_set_task_data(GTask *task, gpointer task_data GDestroyNotify task_data_destroy);
处理函数使用task_data方式:typedef void (*GTaskThreadFunc)(GTask *task,gpointer source_object,gpointer task_data,GCancellable *cancellable);
3、同步执行和异步执行,注: 一定调用 g_task_return_pointer或者g_task_return_error返回
void g_task_run_in_thread(GTask *task,GTaskThreadFunc task_func);
void g_task_run_in_thread_sync(GTask *task, GTaskThreadFunc task_func);
调用时机:调用task完成后的回调函数, GAsyncReadyCallback的调用时机 是main event loop的下一次迭代。
4、执行回调函数
typedef void (*GAsyncReadyCallback) (GObject *source_object,GAsyncResult *res,gpointer data);
5、示例
extern "C"{
#include "glib.h"
#include "glib-object.h"
#include "gio/gio.h
#include <stdio.h>
#include <stdlib.h>
}
typedef int CakeFlavor;
typedef int CakeFrostingType;typedef struct {guint radius;CakeFlavor flavor;CakeFrostingType frosting;char *message;
} CakeData;typedef GObject Cake;static void cake_data_free(CakeData *cake_data)
{printf("main thread %p: %s\n", g_thread_self(), __func__);g_free(cake_data->message);g_slice_free(CakeData, cake_data);
}static Cake *bake_cake(GObject *self, guint radius, CakeFlavor flavor,CakeFrostingType frosting, char *message,GCancellable *cancellable, GError **error)
{printf("end------sub thread %p: %s\n\n", g_thread_self(), __func__);return (Cake *)g_object_new(G_TYPE_OBJECT, NULL);
}static void bake_cake_thread(GTask *task, gpointer source_object,gpointer task_data, GCancellable *cancellable)
{GObject *self = (GObject *)source_object;CakeData *cake_data = (CakeData *)task_data;Cake *cake;GError *error = NULL;printf("\nstart-----sub thread %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);if (g_task_set_return_on_cancel (task, FALSE)){g_task_return_pointer (task, cake, g_object_unref);}
}static void baker_bake_cake_async(GObject *self, guint radius, CakeFlavor flavor,CakeFrostingType frosting,const char *message,GCancellable *cancellable,GAsyncReadyCallback callback,gpointer user_data)
{CakeData *cake_data;GTask *task;printf("main thread %p: %s\n", g_thread_self(), __func__);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);g_task_set_task_data(task, cake_data, (GDestroyNotify)cake_data_free);
//    g_task_set_return_on_cancel (task, TRUE);g_task_run_in_thread(task, bake_cake_thread);
//    g_task_set_check_cancellable(task,TRUE);g_object_unref(task);
}static Cake * baker_bake_cake_sync(GObject *self, guint radius, CakeFlavor flavor,CakeFrostingType frosting,const char *message,GCancellable *cancellable,GAsyncReadyCallback callback,gpointer user_data)
{CakeData *cake_data;GTask *task;printf("main thread %p: %s\n", g_thread_self(), __func__);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, NULL, NULL);g_task_set_task_data(task, cake_data, (GDestroyNotify)cake_data_free);
//    g_task_set_return_on_cancel (task, TRUE);g_task_run_in_thread_sync(task, bake_cake_thread);Cake *cake;GError *error = NULL;cake = (Cake *)g_task_propagate_pointer (task, &error);printf("baker_bake_cake_sync cake: %p\n", cake);g_object_unref(task);return cake;
}static Cake *baker_bake_cake_finish(GObject *self, GAsyncResult *res,GError **error)
{g_return_val_if_fail(g_task_is_valid(res, self), NULL);printf("main thread %p: %s\n", g_thread_self(), __func__);return (Cake *)g_task_propagate_pointer(G_TASK(res), error);
}static void my_callback(GObject *source_object, GAsyncResult *res,gpointer user_data)
{GObject *baker = (GObject *)source_object;GMainLoop *loop = (GMainLoop *)user_data;Cake *cake;GError *error = NULL;printf("main thread %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)
{GObject *baker = (GObject *)g_object_new(G_TYPE_OBJECT, NULL);GCancellable *cancellable = g_cancellable_new();GMainLoop *loop = g_main_loop_new(NULL, FALSE);Cake * cake = baker_bake_cake_sync(baker, 10, 20, 30, "sync", cancellable, my_callback, loop);g_object_unref(cake);baker_bake_cake_async(baker, 10, 20, 30, "async", cancellable, my_callback, loop);g_object_unref(cancellable);printf("main thread %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;
}

输出结果:
main thread 000001F6F9BED030: baker_bake_cake_sync
start-----sub thread 000001F6F9BEF0C0: bake_cake_thread
end------sub thread 000001F6F9BEF0C0: bake_cake
baker_bake_cake_sync cake: 000001F6F9BEE140
main thread 000001F6F9BED030: cake_data_free
main thread 000001F6F9BED030: baker_bake_cake_async
main thread 000001F6F9BED030: start event loop.
start-----sub thread 000001F6F9BEF0C0: bake_cake_thread
end------sub thread 000001F6F9BEF0C0: bake_cake
main thread 000001F6F9BED030: my_callback
main thread 000001F6F9BED030: baker_bake_cake_finish
A cake is baked: 000001F6F9BEE380
main thread 000001F6F9BED030: cake_data_free

相关文章:

gtask笔记

1、创建Task GTask *g_task_new (gpointer source_object, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer callback_data); source_object&#xff1a;GObject对象&#xff0c;拥有者 cancellable&#xff1a;可否取消 callback&#xff1a;task完成后…...

【Linux学习】深入探索进程等待与进程退出码和退出信号

文章目录 退出码return退出 进程的等待进程等待的方法 退出码 main函数的返回值&#xff1a;进程的退出码。 一般为0表示成功&#xff0c;非0表示失败。 每一个非0退出码都表示一个失败的原因&#xff1b; echo $&#xff1f;命令 作用&#xff1a;查看进程退出码。&#xf…...

Linux:线程

文章目录 前言1. 线程概念1.1 什么是线程1.2 线程比进程更加轻量化1.3 虚拟地址到物理地址的转化物理内存的管理页表 1.4 线程的优点1.5 线程的缺点1.6 线程异常1.7 线程用途 2. 进程 vs 线程3. 线程控制3.1 线程创建3.2 线程退出3.3 线程等待3.4 分离线程3.5 线程取消 4. 线程…...

卡到BUG了:删除重发白得积分(以前删除会扣减积分)

以前是&#xff1a;删除文章&#xff0c;积分减少&#xff0c;点赞积分减少&#xff0c;从回收站恢复文章&#xff0c;积分恢复&#xff0c;点赞数恢复但点赞积分不恢复。也就是删除重发总积分减少点赞的积分&#xff0c;有损失。 今天是&#xff1a;删除文章&#xff0c;积分不…...

轻松拿捏C语言——【字符函数】字符分类函数、字符转换函数

&#x1f970;欢迎关注 轻松拿捏C语言系列&#xff0c;来和 小哇 一起进步&#xff01;✊ &#x1f308;感谢大家的阅读、点赞、收藏和关注&#x1f495; &#x1f339;如有问题&#xff0c;欢迎指正 感谢 目录&#x1f451; 一、字符分类函数&#x1f319; 二、字符转换函数…...

【Rust日报】ratatui版本更新

[new ver] ratatui v0.26.3 一个构建终端用户界面的库。新版本包括&#xff1a; 修复Unicode 截断 bug对颜色更好地序列化更快的渲染弃用assert_buffer_eq宏暴露错误类型常量函数和类型 官网: https://ratatui.rs/ 链接: https://ratatui.rs/highlights/v0263/ [new lib] ansi2…...

力扣每日一题 5/28

题目&#xff1a;2951-找出峰值 给你一个下标从 0 开始的数组 mountain 。你的任务是找出数组 mountain 中的所有 峰值。 以数组形式返回给定数组中 峰值 的下标&#xff0c;顺序不限 。 注意&#xff1a; 峰值 是指一个严格大于其相邻元素的元素。数组的第一个和最后一个元…...

async函数和await函数

一、async函数 async是一个加在函数前的修饰符&#xff0c;被async定义的函数会默认返回一个Promise对象resolve的值。 因此对async函数可以直接then&#xff0c;返回值就是then方法传入的函数。 // async基础语法 async function fun0(){console.log(1);return 1; } fun0()…...

Redis面试题深度解析

1、我看你做的项目中&#xff0c;都用到了redis&#xff0c;你在最近的项目中哪些场景使用了redis呢? 2、缓存穿透 布隆过滤器的误判现象 Redisson和Guava都对布隆过滤器进行了实现 3、缓存击穿 互斥锁&#xff0c;就是一个线程来修改&#xff0c;并占据了锁&#xff0c;另外其…...

Ubuntu 22.04 .NET8 程序 环境安装和运行

前言 我们需要将.NET8编写的console控制台程序&#xff0c;部署在Ubuntu服务器上运行。 安装.NET运行时 1.增加微软包安装源 wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages…...

MetaRTC-ffmpeg arm移植

touch cmake_arm.sh 添加 rm -rf build mkdir build cd build ARCHaarch64.cmake cmake -DCMAKE_BUILD_TYPERelease -DCMAKE_TOOLCHAIN_FILE../$ARCH .. maketouch cmake_arm.sh 添加 SET(CMAKE_SYSTEM_NAME Linux) SET(CMAKE_C_COMPILER /home/yqw/MetaRTC/BC/stbgcc-6.3-1…...

【乐吾乐3D可视化组态编辑器】模型类型与属性

编辑器地址&#xff1a;3D可视化组态 - 乐吾乐Le5le 本章主要为您介绍模型的属性功能。 一个模型至少会包含一个节点&#xff08;Node&#xff09;&#xff0c;从节点类型上可以分为转换节点&#xff08;TransformNode&#xff09;、网格&#xff08;Mesh&#xff09;、实例网…...

PyQt下拉框QComboBox点击下拉时即更新下拉数据

在 PyQt 中&#xff0c;QComboBox 控件本身并没有直接的事件或信号来指示下拉列表何时被打开&#xff08;即用户点击了下拉箭头&#xff09;。但是&#xff0c;你可以通过其他方式间接地实现这个功能&#xff0c;比如通过重写 QComboBox 的某些方法或者在用户与 QComboBox 交互…...

网上有哪些正规的兼职副业赚钱平台?分享10类正规的网上兼职赚钱平台,让你在家也能赚钱~

在如今的快节奏社会中&#xff0c;越来越多的人开始寻求兼职副业来增加收入。而随着互联网的普及&#xff0c;网上赚钱平台成为了许多人选择的方式之一。然而&#xff0c;面对众多的网上赚钱平台&#xff0c;我们要如何辨别哪些是正规可靠的呢&#xff1f;在本文中&#xff0c;…...

Spring:JWT

文章目录 一、介绍 一、介绍 JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;的方法&#xff0c;用于在双方之间安全地传输信息。这些信息可以是验证、授权、信息交换等。JWT 通常被用于在客户端和服务器之间传递用户信息&#xff…...

Python的selenium爬取

1.selenium 1.1.前言 使用python的requests模块还是存在很大的局限性&#xff0c;例如&#xff1a;只发一次请求&#xff1b;针对ajax动态加载的网页则无法获取数据等等问题。特此&#xff0c;本章节将通过selenium模拟浏览器来完成更高级的爬虫抓取任务。 1.2.什么是seleniu…...

Linux--进程间通信(1)(匿名管道)

目录 1.了解进程通信 1.1进程为什么要通信 1.2 进程如何通信 1.3进程间通信的方式 2.管道 2.1管道的初步理解 2.2站在文件描述符的角度-进一步理解管道 2.3 管道的系统调用接口&#xff08;匿名管道&#xff09; 2.3.1介绍接口函数&#xff1a; 2.3.2编写一个管道的代…...

Hive环境搭建

1 安装Hive 下载文件 # wget -P /opt/ https://mirrors.huaweicloud.com/apache/hive/hive-2.3.8/apache-hive-2.3.8-bin.tar.gz 解压缩 # tar -zxvf /opt/apache-hive-2.3.8-bin.tar.gz -C /opt/ 修改hive文件夹名字 # mv /opt/apache-hive-2.3.8-bin /opt/hive 配置环境变量 …...

网络编程基础(四)

目录 前言 二、多点通信 2.1 单播 2.2 广播 2.2.1 广播得发送端实现--》类似与UDP的客户端 2.3 组播 2.3.1 组播发送端流程--》类似于UDP的客户端流程 2.3.2 组播的接收端流程---》类似于UDP的服务器端流程 前言 多点通信 一、套接字选项得获取和设置 int getsockopt(int…...

将C++ cv:mat 通过JNI 转换为jbtyearray,传到android端

cv::Mat result ; //此处为C获取到的cv::mat结果对象// 编码为JPEG格式std::vector<uchar> buf;cv::imencode(".jpg", result, buf);// 创建一个新的jbyteArray并设置其大小jbyteArray array env->NewByteArray(buf.size());if (array NULL) {// 处理内存…...

北京大学肖臻老师《区块链技术与应用》公开课:12-BTC-比特币的匿名性

文章目录 1.比特币的匿名性不是真的匿名&#xff0c;相当于化名&#xff0c;现金是真的匿名&#xff0c; 2.如果银行用化名的话和比特币的匿名哪个匿名性更好&#xff1f; 银行匿名性比比特币好&#xff0c;因为比特币的区块链的账本是完全公开的&#xff0c;所有人都可以查&am…...

关于datetime获取时间的问题

import datetime print(datetime.now())如果用上述代码&#xff0c;会报错&#xff1a; 以下才是正确代码&#xff1a; from datetime import datetime print(datetime.now()) 结果&#xff1a; 如果想格式化时间&#xff0c;使用代码&#xff1a; from datetime import da…...

Android 视图系统入门指南

1. View&#xff1a;界面的最小单位 本质&#xff1a;屏幕上的一个矩形区域&#xff0c;能显示内容或接收触摸。比喻&#xff1a;就像乐高积木&#xff0c;是组成界面的最小单位。常见子类&#xff1a; TextView&#xff08;文字积木&#xff09;、Button&#xff08;按钮积木…...

服务器磁盘空间被Docker容器日志占满处理方法

事发场景&#xff1a; 原本正常的服务停止运行了&#xff0c;查看时MQTT服务链接失败&#xff0c;查看对应的容器服务发现是EMQX镜像停止运行了&#xff0c;重启也是也报错无法正常运行&#xff0c;报错如下图&#xff1a; 报错日志中连续出现两个"no space left on devi…...

一文带你入门Java Stream流,太强了,mysqldba面试题及答案

list.add(“世界加油”); list.add(“世界加油”); long count list.stream().distinct().count(); System.out.println(count); distinct() 方法是一个中间操作&#xff08;去重&#xff09;&#xff0c;它会返回一个新的流&#xff08;没有共同元素&#xff09;。 Stre…...

GitHub 趋势日报 (2025年06月05日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 1472 onlook 991 HowToCook 752 ChinaTextbook 649 quarkdown 451 scrapy 324 age…...

iOS、Android、鸿蒙、Web、桌面 多端开发框架Kotlin Multiplatform

Kotlin Multiplatform&#xff08;简称 KMP&#xff09;是 JetBrains 推出的开源跨平台开发框架 Kuikly 是腾讯开源的跨端开发框架&#xff0c;基于 Kotlin Multiplatform 技术构建&#xff0c;为开发者提供了技术栈更统一的跨端开发体验 KMP 不仅局限于移动端&#xff0c;它…...

数据库密码加密

数据库密码加密 添加jar包构建工具类具体使用优缺点 添加jar包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency>构建工具类 public class PasswordUtil …...

Vue-3-前端框架Vue基础入门之VSCode开发环境配置和Tomcat部署Vue项目

文章目录 1 安装配置VSCode1.1 安装中文语言插件1.2 主题颜色1.3 禁用自动更新1.4 开启代码提示设置1.5 安装open in browser插件2 安装配置nodejs2.1 配置环境变量2.2 npm与maven的区别2.3 使用npm避坑3 创建Vue项目3.1 两种创建方式3.2 package.json3.3 安装新的依赖3.4 运行…...

SpringBoot3项目架构设计与模块解析

一、项目概述 这是一个基于SpringBoot3构建的企业级后台管理系统&#xff0c;从项目结构来看&#xff0c;系统采用了经典的分层架构设计&#xff0c;包含完整的控制器层、服务层、数据访问层和实体层。项目整合了Web开发、数据库访问、权限控制等核心功能模块。 二、项目整体…...