Qt界面刷新优化的一些心得

2023-11-12

【背景】一个类似Windows任务管理器的性能界面。该界面有多个曲线图同时定时刷新,每个曲线图包括多条曲线更新,数据更新频率大概为一秒一次。程序中曲线图已封装为自定义的图表类,给出数据更新接口。

【初始方案】主程序设计方案上,采用数据收集和数据更新分开的方式,即数据收集线程仅收集并解析来自数据源的数据,并分门别类的存储到共享结构体中。数据更新线程在收到数据更新信号之后,把新的数据刷新到图表中。

【存在问题】数据刷新时,鼠标拖拽主界面移动时存在停顿,且停顿频率与数据刷新频率相当。尤其是当数据量较大或更新频率加快时,停顿效果更新严重。

【问题分析】经调试发现,虽然数据收集线程在对数据收集后已完成数据的解析工作,并将整理好的数据推送给更新线程。但在曲线图更新的过程中,曲线图实例需要从已有曲线的数据拉取出来,删除存在时间最早的数据,再将新的数据更新到已有数据中。这一过程对于单个曲线图同时存在多条曲线的更新时耗时较长,尤其对于主界面同时存在多个曲线图的情况时,更甚。由此导致数据在刷新过程中存在较大程度的延时情况,从主界面的使用情况看,即鼠标拖拽时,出现停顿甚至是程序未响应的发生。

【解决方法】数据收集线程在整理完数据后,将数据通过图表实例的更新接口给入,该接口从对已有的数据进行更新,并保存在实例成员中,但不做刷新处理。在数据收集线程做完本次数据收集和整理过程之后,通过信号量通知更新线程。更新线程获得信号后,调用图表实例的刷新接口,刷新接口将已准备好的数据直接更新到界面中,不再处理其数据,如此一来,在动态更新曲线的过程中,鼠标拖拽不再出现停顿或程序停止运行的情况。

上述过程,可从Demo代码中下载,通过配置其中的 USING_QTIMERUSING_STD_THREAD 调用不同的处理方案(注意,demo使用了Qt的QChart,使用QtCreater需安装相应的模块,Demo中的数据处理过程以延迟模拟)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt界面刷新优化的一些心得 的相关文章

随机推荐

  • 循环语句和字符串拼接

    1 循环语句 循环语句就是让一部分代码重复执行 JavaScript中常用的循环语句有 for while do while 1 for循环 2 while循环 3 do while循环 2 字符串拼接 字符串之间使用 运算符 说明 数字和
  • 基于BERT Adapter的词汇增强型中文序列标注模型

    原创作者 疯狂的Max 论文Lexicon Enhanced Chinese Sequence Labelling Using BERT Adapter 解读 01 背景与动机 近年来 多项研究致力于将词汇信息融入中文预训练模型中以提升命名
  • lstm代码_ARIMA时间序列与LSTM神经网络的PK

    作者 李应硕 人大在读 授权转载 收藏順便 点个 赞 创作不易 前言 时间序列算是我接触的第一个统计学实践项目 也是它把我带进了机器学习的大门 当时的我的工作是根据过往投资和赎回量 每天预估一个需要留的钱 有点类似银行准备金 我本想自己写个
  • Vijava 学习笔记之CustomizationPassword

    CustomizationPassword类介绍 包含密码字符串和一个标志 指定字符串是否为纯文本或加密 Properties NAME TYPE DESCRIPTION plainText xsd boolean Flag to spec
  • c语言中ln,lg,log的表示

    c标准头文件math h中有两个与log有关的函数声明 double cdecl log double X double cdecl log10 double X 1 2 其中log代表ln 即loge log10顾名思义就是lg loge
  • Arduino 初识+项目

    目录 Arduino初识 电路的基本知识 基于此就可以做一些有趣的小玩意 第一个大坑 串口通信 项目 基于Arduino板控制小车 几大问题 1 控制电机转动 2 麦轮的安装 3 电路连接 4 使用PWM调速 5 优化小车行驶的平稳性 PI
  • aarch64交叉编译libturbojpeg

    0 目的 因项目上有使用jpeg turbo的需求 用的aarch64的平台 需要使用交叉编译工具来获取libturbojpeg so 1 libturbojpeg下载 libturbojpeg源码git地址 GitHub libjpeg
  • Hyperledger Fabric如何通过虚拟机部署以太坊智能合约

    EVM作为用户链代码安装到Fabric中 然后可以通过它部署智能合约 单个EVM链代码足以在通道上运行多个以太坊智能合约 链码不采用以太坊的共识方法 所有事务仍将遵循Fabric事务流中的执行 订单 验证步骤 确保在不同组织中的足够对等方安
  • 判断子序列

    给定字符串 s 和 t 判断 s 是否为 t 的子序列 leetcode链接 你可以认为 s 和 t 中仅包含英文小写字母 字符串 t 可能会很长 长度 500 000 而 s是个短字符串 长度 lt 100 字符串的一个子序列是原始字符串
  • 项目经理与技术经理的区别

    项目经理和技术经理有什么区别 区别有多大呢 这个问题此前我从没有认真的去思考过 直到被明确的问到的时候 才细思极恐 连两者的区别都没能有条理的讲出来 一 关于项目经理 在没有真正进入软件行业之前 对于系统集成方面的项目还是有些心得的 有种一
  • 编译Linux内核获取LLVM bitcode (LLVM IR)

    最近要获取linux内核的llvm bitcode 以便后续进行分析 例如获取callgraph等等 尝试了很多提取llvm bitcode的方法 用build bom wllvm 过程中也出现了很多错误 最后用wllvm终于成功了 记录下
  • Docker容器与虚拟化技术:Docker资源控制、数据管理

    目录 一 理论 1 资源控制 2 Docker数据管理 二 实验 1 Docker资源控制 2 Docker数据管理 三 问题 1 docker容器故障导致大量日志集满 造成磁盘空间满 2 当日志占满之后如何处理 四 总结 一 理论 1 资
  • 【模电】0014 运放自激振荡和消除(补偿)

    一般我们讨论的负反馈放大电路多关注其幅频特性 也就是它的增益 而对其相频特性关注的不多 这主要是因为 一个放大电路如果它工作状态是稳定的 其输入和输出相差一定的相位对分析它的特性并不影响 只是相当于信号延迟了一点时间 注意这里有个前提条件
  • 关于IP网段间互访的问题——路由是根本

    文章出处 http blog csdn net dog250 archive 2010 02 09 5303291 aspx 之所以IP网段间可以互相访问 完全靠的就是路由 因此路由是IP通信的根本 IP是机器可以进行通信的资格证书 而路由
  • 【满分】【华为OD机试真题2023 JAVA&JS】工作安排

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 工作安排 知识点循环数组贪心动态规划 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 小明每周上班都会拿到自己的工作清单 工作清单内包含n项工作 每项工作都有对应的
  • Vue Baidu Map使用

    百度地图官方提供的是常规
  • DS单链表--类实现

    用C 语言和类实现单链表 含头结点 属性包括 data数据域 next指针域 操作包括 插入 删除 查找 注意 单链表不是数组 所以位置从1开始对应首结点 头结点不放数据 输入 n 第1行先输入n表示有n个数据 接着输入n个数据 第2行输入
  • 螺旋队列(由里向外)

    假设有如下排列 21 22 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13 1的坐标是 0 0 3的坐标是 1 1 7的坐标是 1 1 分析 第1层之内有1个数 第2层之内有9个数 第3
  • Kafka Connect JNDI注入漏洞复现(CVE-2023-25194)

    漏洞原理 Apache Kafka Connect中存在JNDI注入漏洞 当攻击者可访问Kafka Connect Worker 且可以创建或修改连接器时 通过设置sasl jaas config属性为com sun security au
  • Qt界面刷新优化的一些心得

    背景 一个类似Windows任务管理器的性能界面 该界面有多个曲线图同时定时刷新 每个曲线图包括多条曲线更新 数据更新频率大概为一秒一次 程序中曲线图已封装为自定义的图表类 给出数据更新接口 初始方案 主程序设计方案上 采用数据收集和数据更