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

二十五、Gtk4-多线程分析

1 回顾

1.1 Gnome相关

首先回顾一下GLib,GObject,GIO,Gtk的不同,因为下面会涉及到这些概念里面的函数。

所有这些都是由Gnome项目开发的库,一般都用于Gnome环境相关的应用程序。

  • Gtk:GUI界面库。
  • GLib:是一个通用的、可移植的实用程序库,它提供了许多有用的数据类型、宏、类型转换、字符串实用程序、文件实用程序、主循环抽象等等。
    • GMainLoop
    • GMainContext
    • GThread
    • GAsyncQueue
  • GObject:又名GLib对象系统,对象库(最初用于C编程语言,它不是面向对象的,但由于出现了与许多其他语言的绑定)。最初是GLib的一部分。Gtk中积极使用的对象和Gtk中的许多对象(如Gtk Window)继承了基本的GObject类型。其实就是一个基类型系统。
  • GIO:是一个库,为通用I/O、网络、IPC、设置和其他高级应用程序功能提供了有用的类。
    • GApplication
    • GSettings
    • GTask

1.2 ps命令

#查看运行的程序pid(进程号)
ps aux | grep application(应用程序的名字)
# 查看线程中的进程 -T表示开启线程查看
ps -T -p PID
# 杀死进程
kill -9 PID(进程号)

在这里插入图片描述
第一个标注的地方是CPU和内存占用率,后面的943100是物理内存使用量,单位是k,此时kafka大约占用943M内存
请添加图片描述

程序中我编写了onvif线程和主线程(Gtk),GLib命名的id并不会在ps查询命令显示,只运行该软件大概占用90M内存空间。SPID表示线程ID。

1.3 top命令

# -H表示开启线程查看, -p指定进程ID
top -H -p PID

请添加图片描述

第二个vpf-app应该就是onvif线程

onvif_seek_thread = g_thread_new("vpf.application.onvfi", vpf_application_onvif_run, app);

参考4:对于top命令显示信息的描述非常详细

2 GTK 多线程

2.1 信号与回调函数

GObject对象的信号在那个线程发出,回调函数就是那个线程执行。(跟回调函数在那个线程连接无关)。

Signals get executed in the context they are emitted from. In which context the object is created or where connect() is called from doesn’t matter.

2.2 如何区别函数运行在那个线程

GLib中,线程是一个抽象的概念,不能获取ID,可以通过两种方法判断该函数运行在那一个线程。GThread结构体内容并不公有。(该结构是不透明的——它的任何字段都不能直接访问。)

  • 通过 g_thread_self () 获取GThread结构体地址
  • 通过 pthread_t id = pthread_self ()函数

请添加图片描述
(vpf-app:86269)××××,86269是进程ID,Gtk报致命错误,可能是由于其它线程操作了UI界面。我的错误是因为,onvif线程中操作GListStore,因为GListStore与UI界面GtkColumnView绑定着。

2.3 如何将GTK与线程一起使用?

参考:How do I use GTK with threads?
GTK要求所有GTK API调用都来自创建GtkApplication的同一个线程,或者调用gtk_init()(主线程)。

如果想在GTK应用程序中利用多线程,通常最好将长时间运行的任务发送到工作线程,然后在工作线程使用g_idle_add或者GAsyncQueue反馈结果给UI线程(主线程)。GIO提供了有用的工具GTask。

3 GLib

3.1 GThread

这是一个结构体(不是GObject对象),表示一个正在运行的线程。该结构体由g_thread_new()或g_thread_try_new()返回。通过调用g_thread_self()可以获得表示当前线程的GThread结构体。

GThread被引用,请参阅g_thread_ref()和g_thread_unref()。由它表示的线程在运行时持有一个引用,而g_thread_join()消耗它给出的引用,因此通常没有必要显式管理GThread引用。

该结构是不透明的——它的任何字段都不能直接访问。

通过线程锁、条件,可以实现控制工作线程运行,如果工作线程不需要长时间运行,只有UI操作的时候运行一会,使用GTask更理想。

/* UI线程 *///告诉界面,我要让工作线程执行任务了...
g_cond_signal (&onvif_seek_cond);
/* 工作线程 */
g_mutex_lock (&onvif_seek_lock);/*** 要先上锁,是因为g_cond_wait函数要先解锁(如果未上错,会出错),再进入阻塞,等待cond* 等到cond,然后上锁,执行代码* 这个线程不能进行数据添加,因为添加数据会刷新UI*/
g_cond_wait (&onvif_seek_cond, &onvif_seek_lock);
...
...
g_mutex_unlock (&onvif_seek_lock);

注意

如果同一个线程在没有释放锁的情况下尝试连续两次执行g_mutex_lock(),则会导致死锁。这是因为当线程在第一次调用g_mutex_lock()时获得了互斥锁,并且在第二次调用g_mutex_lock()之前未释放互斥锁。这样,在第二次调用g_mutex_lock()时,线程将一直等待互斥锁被释放,从而导致死锁。

因此,应该避免在同一线程中连续两次调用g_mutex_lock()函数而不释放锁。一种常见的做法是使用g_mutex_trylock()函数来尝试获取互斥锁,如果获取不到,则返回并立即执行其他操作,而不是一直等待锁被释放。另外,在释放锁之前,应该确保在互斥锁保护的临界区内执行的所有操作都已经完成。

3.2 GMainContext

通过把源事件添加到工作线程或者UI线程

3.3 GAsyncQueue

4 GIO

4.1 GTask

4.2 GSettings

参考1:Linux下查看某一进程所占用内存的方法
参考2:Linux上如何查看某个进程的线程
参考3:linux ps命令,查看某进程cpu和内存占用率情况
参考4:Linux命令之top命令查看服务器CPU与内存占用

相关文章:

二十五、Gtk4-多线程分析

1 回顾 1.1 Gnome相关 首先回顾一下GLib,GObject,GIO,Gtk的不同,因为下面会涉及到这些概念里面的函数。 所有这些都是由Gnome项目开发的库,一般都用于Gnome环境相关的应用程序。 Gtk:GUI界面库。GLib&a…...

JVM基础学习

JVM分为两个子系统,两个组件一个子系统是Class loader类装载系统,另一个子系统是Execution Engine执行引擎一个组件是Runtime data area 运行时数据区,Native Interface 本地接口Class loader:根据给定的全限定类名来装载class文件到运行时数…...

ASML逆袭史:人、资金、技术,缺一不可

前言 近年来,由于众所周知的原因,荷兰ASML(阿斯麦)公司的先进半导体制造设备——光刻机,进入普通大众视野,成为人们茶余饭后谈论的焦点话题之一。 1月底,“美日荷三方谈判达成协议,可…...

MongoDB 覆盖索引查询

MongoDB 覆盖索引查询 官方的MongoDB的文档中对覆盖查询做了说明: 所有的查询字段是索引的一部分所有的查询返回字段在同一个索引中 由于所有出现在查询中的字段是索引的一部分, MongoDB 无需在整个数据文档中检索匹配查询条件和返回使用相同索引的查询…...

Flink Checkpoint 中的Aligned Checkpoint 和 Unaligned Checkpoint

文章目录知识点反压CheckpointBarrierAligned CheckpointUnaligned Checkpoint核心思想实现原理UC同步阶段UC异步阶段知识点 反压 反压是流式系统中关于处理能力的动态反馈机制,并且是从下游到上游的反馈,一般是在实时数据处理的过程中,上游…...

C++快速入门

本章内容我将结合C语言一起,初步学习了解c,与大家一起快速入门这门语言。当然鉴于c本身属于一门中级语言,大家对编程有一定了解之后来学习这门知识会更加得心应手。简介C 被认为是一种中级语言,它综合了高级语言和低级语言的特点。…...

ubuntu18.04 network有线网络图标缺失解决记录

先按照博客1安装驱动   博客1链接:Ubuntu安装 Realtek R8125 驱动_Lwang2018的博客-CSDN博客_瑞昱8125 for ubunt 安装完成后,遇到问题:ifconfig -a显示的有线网接口(名字以en开头)没有ip地址…...

java对象克隆和面向对象的设计原则

java进阶注解内置注解元注解自定义注解对象克隆浅克隆深克隆java设计模式建模语言类之间的关系依赖关系关联关系单向关联双向关联自关联聚合关系组合关系继承关系实现关系面向对象设计原则单一职责开闭原则里氏替换原则依赖倒置接口隔离迪米特原则组合/聚合复用原则注解 java注…...

传透式血氧仪设计方案

该方案一种检测方式是选择使用光敏二极管接收光信号,采用传统穿透式夹指测量;另一种是使用光谱传感器接收光信号,采用反射式测量。该传感器可将光信号直接转换成数据信息给主控端进行处理,从而节省了用户将光信号转换成模拟信号&a…...

让逆向工程师们头疼的代码混淆,就像永远也走不出的“浪浪山”

目录 代码混淆究竟是什么? 如何做代码混淆? 代码混淆不等于加密 App 加固非一时之功 “我想离开浪浪山。” 在数次尝试破解某个App 时,某个逆向工程师无奈感慨道。 逆向工程师顾名思义就是把一个个完整的软件逆推,还原成一段段…...

【拓展】基于机器学习的心脏病预测方法(14)——心脏病数据集补充

目录 前言1、数据集11.1 数据集介绍1.2 数据集属性2、数据集22.1 数据集介绍2.2 数据集属性3、数据集33.1 数据集介绍3.2 数据集属性4、下载地址前言 在实际研究过程中,前文所述数据集由于尺寸过小(仅有303份数据和13个属性信息)或数据集单一(仅有一个数据集,不具备普适性…...

深度解读Webpack中的loader原理

一、前言 webpack 是一个现代 JavaScript 应用的静态模块打包器。那么 webpack 是怎样实现不同种类资源模块加载的呢? 没错就是通过 loader。loader 用于对模块的源代码进行转换。loader 可以使你在 import 或加载模块时预处理文件。 我们带着下面几个问题&#…...

2023年全国最新二级建造师精选真题及答案

百分百题库提供二级建造师考试试题、二建考试预测题、二级建造师考试真题、二建证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 一、单选题 1.关于法人在建设工程中的地位的说法,正确的是(&#xff0…...

为什么现代企业发展离不开CRM系统的助力

如今的CRM系统对于任何企业来说都重要,因为它能帮助企业收获新客户,保留现有客户,并且将不同部门的信息全部汇集,实时提供关于每位客户整体全面的看法。因此,销售、市场营销和客户支持等领域的客户直接服务员工能够做出…...

vb.net计算之.net core基础(1)-获取农历和天气

目录 .net core 简介创建hello,world应用程序获取天气和农历.net core 简介 .NET Core是适用于 Windows、Linux 和 macOS 的免费、开源托管的计算机软件框架。 它是微软开发的第一个官方版本,具有跨平台能力的应用程序开发框架 (Application Framework),未来也将会支持 Free…...

设计模式之代理模式详解和应用

目录1 代理模式定义2 代理模式的应用场景3 代理模式的通用写法4 从静态代理到动态代理5 静态模式在业务中的应用6 动态代理在业务中的应用7 手写JDK动态代理实现原理7.1 JDK动态代理的实现原理7.2 CGLib动态代理容易踩的坑8 CGLib代理调用API及原理分析9 CGLib和JDK动态代理对比…...

JavaScript HTML DOM 节点列表

HTML DOM 是一种文档对象模型,它允许开发人员使用 JavaScript 来访问和修改网页的内容和结构。节点列表是 HTML DOM 中一个重要的概念,它允许开发人员以编程方式访问和操作文档中的节点元素。 在本文中,我们将探讨 JavaScript HTML DOM 节点…...

【音视频处理】码率、帧率越高越清晰?分辨率、像素、dpi之间是什么关系?码率的真实作用,I帧、B帧、P帧是什么

大家好,欢迎来到停止重构的频道。本期我们介绍一下视频的一些基础概念,如帧率、码率、分辨率、像素、dpi、视频帧、I帧、P帧、gop等。会解释多少码率是清晰的,是否帧率越高越流畅等问题。这些概念是比较杂乱的,我们按这样的顺序介…...

Java基础-认识注释、标识符关键字

注释 平时我们编写代码,当代码量较小时候,我们还可以看懂自己写的代码。但是当项目结构一旦复杂起来,我们就需要用到注释啦。注释并不会被执行,是写给我们开发者看的。 在java中的注释有三种 标识符 常见关键字 Java所有的组…...

【C#】静态扩展方法

静态类特征:1.不能用sealed或abstract修饰符;2.必须直接继承System.Object类型,不能试任何其他类的派生类;3.不能实现任何接口;4.不能包含任何操作符;5.不能使用protected或者protected internal修饰的静态成员&#x…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

抽象类和接口(全)

一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...