当前位置: 首页 > 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) {// 处理内存…...

2026免费照片去水印软件app排行榜 | 照片去水印怎么去?最新推荐工具对比

照片水印去除需求在2026年越来越普遍&#xff0c;无论是整理个人相册还是做内容素材处理&#xff0c;找到一款趁手的去水印工具能节省大量时间。本文对标当前免费照片去水印软件app的主流选择进行了全面测评&#xff0c;并整理了一份排行榜式的推荐清单&#xff0c;帮你快速定位…...

中文Kodi媒体中心终极指南:4大本土化插件解决方案

中文Kodi媒体中心终极指南&#xff1a;4大本土化插件解决方案 【免费下载链接】xbmc-addons-chinese Addon scripts, plugins, and skins for XBMC Media Center. Special for chinese laguage. 项目地址: https://gitcode.com/gh_mirrors/xb/xbmc-addons-chinese 你是否…...

2026有赞春季发布会:有效果的AI驱动增长,智能体和数字员工交出成绩单

5月21日&#xff0c;有赞2026年春季发布会在杭州举办&#xff0c;主题是“有效果的AI”。过去一年&#xff0c;有赞智能体和数字员工已经迈入交付结果的新阶段。数据显示&#xff0c;2025年有赞AI智能体活跃使用商家18220个&#xff0c;整体调用量超3600万次&#xff0c;引导成…...

snnTorch NIR导出功能详解:实现跨框架模型转换

snnTorch NIR导出功能详解&#xff1a;实现跨框架模型转换 【免费下载链接】snntorch Deep and online learning with spiking neural networks in Python 项目地址: https://gitcode.com/gh_mirrors/sn/snntorch snnTorch是一个基于Python的脉冲神经网络&#xff08;SN…...

【深度解析】从 Antigravity 2.0 看 AI Agent 的产品化演进:动态子代理、项目工作区与多模型编排实战

摘要&#xff1a; Google Antigravity 2.0 的核心变化&#xff0c;不只是功能增加&#xff0c;而是把 AI Agent 从“对话工具”推进到“可编排的执行系统”。本文解析动态子代理、项目级工作区、后台任务与工具链设计&#xff0c;并给出基于 OpenAI 兼容接口的 Python 实战代码…...

CANN ops-sparse与Ascend C编程:深入理解NPU原生稀疏计算

CANN ops-sparse与Ascend C编程&#xff1a;深入理解NPU原生稀疏计算 【免费下载链接】ops-sparse 本项目是CANN提供的高性能稀疏矩阵计算的算子库&#xff0c;专注于优化稀疏矩阵的计算效率。 项目地址: https://gitcode.com/cann/ops-sparse 在高性能计算领域&#xf…...

ElevenLabs芬兰语TTS部署踩坑实录(含CI/CD流水线集成模板):1次失败=2.3小时调试,我们帮你省下87%时间

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;ElevenLabs芬兰语TTS部署踩坑实录&#xff08;含CI/CD流水线集成模板&#xff09;&#xff1a;1次失败2.3小时调试&#xff0c;我们帮你省下87%时间 核心痛点&#xff1a;芬兰语语音合成的隐性陷阱 ElevenLab…...

大学生零基础打CTF比赛全攻略:要学啥、怎么学,看完就能参赛

大学生零基础打CTF比赛全攻略&#xff1a;要学啥、怎么学&#xff0c;看完就能参赛&#xff08;干货版&#xff09; 摘要&#xff1a;对大学生来说&#xff0c;CTF&#xff08;Capture The Flag&#xff0c;夺旗赛&#xff09;不仅是网络安全领域最具实战性的竞赛&#xff0c;…...

AM62x处理器SPI总线实战:从原理到Linux驱动配置与调试

1. 从四根线到高效数据流&#xff1a;深入拆解AM62x处理器的SPI总线实战在嵌入式开发里&#xff0c;和各类传感器、存储芯片、显示屏打交道是家常便饭。当你需要一种简单、高效、引脚又少的通信方式时&#xff0c;SPI总线几乎总是首选方案。它就像一条精心设计的高速公路&#…...

如何快速配置ImageGlass:Windows上最轻量的开源图片查看器完整指南

如何快速配置ImageGlass&#xff1a;Windows上最轻量的开源图片查看器完整指南 【免费下载链接】ImageGlass &#x1f3de; A lightweight, versatile image viewer 项目地址: https://gitcode.com/gh_mirrors/im/ImageGlass 还在为Windows自带的图片查看器功能有限而烦…...