qt单线程实现顺序事件的处理不卡顿技巧(IDE开发)

news2024/9/20 14:27:30

需求:

我现在是这样的需求,我正在开发一款嵌入式IDE中,编辑器中光标改变,右侧的符号大纲能对应的改变选中项。

这里的过程是这样的,鼠标位置改变事件函数里,通过光标行号,计算得到当前处于的符号(这是个耗时过程),然后在右侧的大纲里选中对应符号。

问题:

用户可能会快速的改变光标位置,导致一连串的鼠标位置改变事件需要处理,从而光标位置改变就是卡顿的。

这个问题的处理方法:

1. 就串行处理,事件函数里判断光标所在行是不是和上次仍然相同,如果所在行相同,那么就不更新大纲位置了。这样来加快不必要的更新。

2. 用一个定时器,当光标位置停下来了100ms后,再处理这个符号位置更新。这样能让连续事件得到丢弃处理。但是光标停下来了,此时如果定时到了,正在处理大纲,光标刚好又动了,此时光标就被卡住了。这个情况发生的可能性还是很小的。

3. 多线程方式,每次更新前就启动一个线程,而且先判断前一个线程是否还未完成,如果还未完成,先停止前一个线程。

4. 在处理过程中调用qt的事件处理循环(这样会产生事件重入),同时结合两个标志变量,就能解决问题重入了,此时只有最后一次的重入才会更新界面。中途处理系统事件了,界面也不会卡顿了。本方法见本文末尾。
 

总结:

方法1逻辑最清晰,在性能无明显影响的情况下,当然就用这个啦。方法2也不错,实现复杂一点,但是比方法1性能好。方法3有点重量化了,需要开线程。方法4逻辑复杂,但是比方法1和2的性能都强。

这里我的符号表不大,所以方法1是可以满足性能了的,所以就用这个。

方法4伪代码与示意图:

int level = 0;

bool can'tUpdate = false;

void cursorChangeEvent(int line)

{

        level++;

        耗时计算(line);

        QApplication::processEvent();

        if(can'tUpdate == false)

                更新符号大纲();

        level--;

        if(level > 0)

                can'tUpdate = true;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/60594.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过私钥连接腾讯云,实现免密远程登录

一、创建 SSH 密钥 系统提示不会保存私钥,要求用户在 10 分钟之内自行下载私钥,要保存在本地电脑和邮箱里面备用。 二、绑定密钥到云服务器 勾选刚才创建的 SSH 密钥,点击上面的绑定云主机,弹窗中要先找到你云主机的地域&#x…

【计算机毕业设计】74.家教平台系统源码

一、系统截图(需要演示视频可以私聊) 摘 要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐…

CentosLinux 6.5安装教程

、开始安装Centos6.5:我们选择“inistall system with basic video driver” 注意:这是一种精简系统的安装模式: 1.安装或升级现有的系统; 2.安装系统并使用基本的显卡驱动; 3.进入系统修复模式; 4.从硬盘…

[附源码]Python计算机毕业设计SSM竞赛报名管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【计算机毕业设计】基于jsp网上书店(源代码+论文)

网上书店系统 1.需求分析。 参考设计要求,及可行性的分析,我们确定了如下的需求: 1.数据库设计科学合理。 2.网站主页面简洁美观,可以天蓝色为主色调。 3.网站主页显示各个分类的及总的畅销表、新书榜、推荐榜,显…

Allegro如何锁定器件操作指导

Allegro如何锁定器件操作指导 Allegro上可以锁定器件,避免误操作被移动,具体操作如下 选择fix命令 Find选择Symbols 框选需要锁定的器件 可以看到器件被锁住了 除了这个方法之外,还有另外一种方法锁定器件,选择edit-property Find选择Symbols

ADSP-21569/ADSP-21593的开发入门(中)

ADSP-21569/21593的软件准备 安装CCES软件,我装的是2.10.1,官网可以下载,我也可以提供。软件安装没什么可说的,全部下一步,软件的试用跟注册可以单独联系我。 https://www.analog.com/cn/design-center/evaluation-h…

做短视频创业之前必须确定的内容:变现形式,短视频玩法和人设定位

做短视频创业之前必须确定的内容:变现形式,短视频玩法和人设定位。这是短视频的根基,打好基础才能更好的实现盈利目标。 开始做短视频的时候,走了很多弯路,这段时间总结了之前的经验教训,结合在我赢助手上…

【编程题】【Scratch四级】2022.09 班级成绩处理

班级成绩处理 三年级1班有36个小朋友,某次数学考试,同学们的成绩在78-100之间,求出该班学生的平均分和成绩优秀的人数(成绩大于85分)。 1. 准备工作 (1)默认小猫角色,默认白色背景…

Python学习基础笔记二十一——迭代器

列表,我们使用for循环来取值,我们把每个值都取到,不需要关心每一个值的位置,因为只能顺序的取值,并不能跳过任何一个去取其他位置的值。那么我们为什么可以使用for循环来取值,for循环内部是怎么工作的呢&am…

【力扣算法简单五十题】17.路径总和

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。 叶子节点 是指没有子节点…

模仿Spring注入接口的代理类全过程

前言 在使用mybatis或者openFeign时只定义了一个接口类,并无实现类,可以把接口注入到service中并且能调用方法返回值。一个接口并无实现类,为什么可以实例化并且交给了spring管理。mybatis,OpenFeign又是怎么实现的?接…

生物化学 核磁共振 氢谱 n+1定律 邻碳耦合 同碳耦合

核磁共振氢谱 基础 自旋量子数 自旋为S的粒子,取向的范围为[-S,S],但是需要间隔1。比如质子的自旋为1/2,则有-1/2 ,1/2两个取向。取值的个数等于在外加磁场的情况下能够分裂的能级的个数。但是质量数和原子序数都为0的原子(C12,O16C^{12},O^{16}C12,O1…

Java ~ Executor ~ LinkedBlockingQueue【总结】

一 概括 简介 LinkedBlockingQueue(链接阻塞队列)类是BlockingQueue(阻塞队列)接口的主要实现类之一,也是Executor(执行器)框架最常搭配使用的实现之一,采用链表的方式实现。相比基于…

Qt+opencv 鼠标画线实现几何图形识别并动态创建

前言 使用Qt OpenCV实现,通过鼠标画线绘制几何图形,然后通过opencv进行图形轮廓识别,返回图形顶点,然后创建对应的几何图形添加到场景中。绘制使用QGraphics体系完成。 看效果图: 本文demo在这里 点击下载 环境: …

python在centos下安装以及配置

python在centos下安装以及配置 1.背景 centos下默认的都是python2.7下载需要更换为3.x使用,目前大部分应用都是基于pyhton3了 具体步骤: 我下载一个3.8.15的包 https://www.python.org/ftp/python/3.8.15/Python-3.8.15.tgz 小注释:如果…

动手学深度学习(2)—— 线性神经网络

文章目录线性神经网络线性回归线性回归从零开始的实现生成数据集读取数据集初始化模型参数定义模型定义损失函数定义优化算法训练线性回归的简洁实现生成数据集读取数据集定义模型初始化模型参数定义损失函数定义优化算法训练softmax 回归softmax运算交叉熵损失图像分类数据集读…

浅谈降维实操,一种用于处理特征的方式——后附Python代码

👦👦一个帅气的boy,你可以叫我Love And Program 🖱 ⌨个人主页:Love And Program的个人主页 💖💖如果对你有帮助的话希望三连💨💨支持一下博主 降维实操前言线性降维低…

list的模拟实现(万字解读+由浅入深)

先申明一下本篇总体介绍过程是按照逐步深入去写的,所以可能有些同样类型不在一块! 前言: 写这篇博客的时候,我是边思考边写它!自己其中感觉自己对于list的理解更加的深入,其中提出的很多问题让我明白了lis…

Android Studio 实现桌面小组件(APPWidget)

前言 微件是定制主屏幕的一个重要方面。它允许您从用户的主屏幕直接看到最重要的应用程序数据和功能。用户可以在主屏幕面板之间移动微件、调整其大小,并根据自己的喜好自定义微件中的信息量。微贱类型主要分为:信息微件(显示对用户来说很重…