qt 提高ui响应度
如何使Qt 平台中的GUI保持响应流畅?一般来说耗时较长的操作,分为计算密集型操作和IO密集型操作,对于这两类操作如何提高响应速度。
而从操作的本质上来说,操作又可分为不可分解操作,如在第三方库中耗时较长的操作,以及可分解操作,其中可分解操作又可细分为串行操作和可并行操作,如何针对这几类操作来提高响应速度呢?
如何将异步的操作,如网络库中异步的读取数据方法,变成同步的操作?
此外对于多线程,普遍的看法是可以提供程序的运行速度,其实不然,不正确地使用线程常常会使程序变慢,那么在QT中是否可以通过多线程以外的方法来提高响应速度呢?本文给你解决。
首先什么是对GUI的响应?答:GUI的响应就是系统对于GUI事件的处理速度。
由于系统处理事件需要一定的时间,所以一般窗口系统都会提供一个事件队列来存储事件。如果把每个事件处理看成一个任务的话,那么事件处理就类似于操作系统对于任务按照优先级进行处理,使得每个任务的平均等待时间最小。那么就可以借鉴一下操作系统中的方法,比如:
分级,让较长的任务延后执行。
分时,对于较长的任务,让其执行一段时间后暂停,然后再执行。
减少每个任务运行的耗时,当然这是最基本的方法。
先看第一个分级,当一个事件处理程序知道自己将执行耗时很长的操作时,可以调用QCoreApplication::processEvents() 方法,等待消息队列中的方法都执行完再执行。当然这是一个最基本的方法,只适用与简单的情况,如果事件队列中的另一程序也调用了该方法则会出现死锁。
再看分时,它适用于可分解的操作(包括串行操作和并行操作),只需记录当前任务的执行情况,然后可以再次执行。它的使用流程如下:
- Function EventHandler()
- {
- //开始计时
- While(执行时间 < 用户可接受的响应时间)
- {
- //执行操作: }
- //注册系统空闲事件以继续处理
- }
在QT中注册系统空闲事件的方法可以通过QTimer::singleShot(0, this, SLOT(calculate()));将系统空闲信号注册到自己的槽中。或者使用QMetaObject::invokeMethod(this, "calculate", Qt::QueuedConnection);方法,通过invokeMethod异步的执行某个方法。
最后重点看一下如何减少响应的时间,对于数据密集型操作,推荐使用ThreadPool来管理,减少线程上下文切换的时间;而对于IO密集型操作,则自己管理一个thread来实现,而这也是我认为thread最应该使用的情景,即让CPU和外设都处于满负荷运转状态,减少总的操作时间。
对于并行操作响应时间的减少,在QT中引入了Qt Concurrent的概念,采用Map/Reduce的方式,具体可以参考QT中的Concurrent Programming节。
最后再解答下如何在QT中将异步操作改成同步操作的方法,这个就属于QT special的内容,一般的读者可以跳过。
具体的代码如下所示:
- QNetworkAccessManager manager;
- QEventLoop q;
- QTimer tT;
- tT.setSingleShot(true);
- connect(&tT, SIGNAL(timeout()), &q, SLOT(quit()));
- connect(&manager, SIGNAL(finished(QNetworkReply*)),
- &q, SLOT(quit()));
- QNetworkReply *reply = manager.get(QNetworkRequest(QUrl("http://www.qtcentre.org")));
- tT.start(5000); // 5s timeout
- q.exec();
- if(tT.isActive()){
- // download complete
- tT.stop();
- } else {
- // timeout
- }
其中主要利用了QEventLoop类,它将创建一个本地的Event loop,然后block,直到接受到finished信号,或者timeout超时信号后才退出,而事件循环则不会被block。
qt 提高ui响应度的更多相关文章
- iOS开发之多种Cell高度自适应实现方案的UI流畅度分析
本篇博客的主题是关于UI操作流畅度优化的一篇博客,我们以TableView中填充多个根据内容自适应高度的Cell来作为本篇博客的使用场景.当然Cell高度的自适应网上的解决方案是铺天盖地呢,今天我们的 ...
- 转:iOS开发之多种Cell高度自适应实现方案的UI流畅度分析
本篇博客的主题是关于UI操作流畅度优化的一篇博客,我们以TableView中填充多个根据内容自适应高度的Cell来作为本篇博客的使用场景.当然Cell高度的自适应网上的解决方案是铺天盖地呢,今天我们的 ...
- qt中ui的 使用介绍
1.什么是ui?ui通常是用Qt 设计师设计出来的界面文件的后缀.通常情况下ui是一个指向这个界面类的指针.ui-> 一般就是用来访问这个界面类里面的控件.例如你的ui文件里有一个叫okButt ...
- Qt中Ui名字空间以及setupUi函数的原理和实现 <转>
用最新的QtCreator选择GUI的应用会产生含有如下文件的工程 下面就简单分析下各部分的功能. .pro文件是供qmake使用的文件,不是本文的重点[不过其实也很简单的],在此不多赘述. 所以呢, ...
- QT在ui文件上建立信号操机制会不会对后期维护产生影响 - love4Mario的专栏 - 博客频道 - CSDN.NETQT在ui文件上建立信号操机制会不会对后期维护产生影响 - love4Mario的专栏 - 博客频道 - CSDN.NET
QT在ui文件上建立信号操机制会不会对后期维护产生影响 - love4Mario的专栏 - 博客频道 - CSDN.NET QT在ui文件上建立信号操机制会不会对后期维护产生影响 分类: 学习心得 2 ...
- Qt中Ui名字空间以及setupUi函数的原理和实现
用最新的QtCreator选择GUI的应用会产生含有如下文件的工程 下面就简单分析下各部分的功能. .pro文件是供qmake使用的文件,不是本文的重点[不过其实也很简单的],在此不多赘述. 所以呢, ...
- 前端设计师如何提高UI界面中的阅读性
阅读体验是ui设计中必不可少的一项,良好的设计应该都是可读的设计,如果信息都无法正常而清晰的传达,那么设计就失去了意义.设计的可读性和排版设计息息相关,这也就跟设计师的设计功底息息相关.下面简单介绍文 ...
- 风险案例-28期-项目Leader与团队成员缺乏沟通,问题响应度较慢导致团队士气低落,工作效率低
典型案例: A公司某C类项目目前进入开发高峰期,项目组的三个leader预计在项目的实际task投入占比为70%,剩30%工作时间用于指导组员进行作业实施并担当部分管理工作.从项目实施过程中发现Lea ...
- 提高UI设计效率的4个技巧
提高UI设计效率的4个技巧 如何提高UI设计的速度?在这里分享一些我观察到的常见问题和改善方式.当然,需要注意的地方何其多. 身为设计师的你,应该要了解工程实作的基本原理: 业界 NG 率:接近 10 ...
随机推荐
- yii2-datepicker/datetimepicker插件使用
datepicker: https://github.com/2amigos/yii2-date-picker-widget 通过composer安装: composer require 2amigo ...
- HBase介绍及简易安装(转)
HBase介绍及简易安装(转) HBase简介 HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问,是Google的BigTable的开源实现.HBase的目标是存 ...
- Corelocation及地图控件学习笔记
Corelocation基本使用 在地图章节的学习中,首先要学的便是用户位置定位,因此我们首先要掌握Corelocation的使用.(在IOS8以前可以系统会直接请求授权,现在需要我们自己调用方式通知 ...
- (八)C语言结构体和指针
指针也可以指向一个结构体变量.定义的一般形式为: struct 结构体名 *变量名; 前面已经定义了一个结构体 stu: struct stu { char *name; int num; char ...
- 国内外常用的DNS服务器
国内外常用的DNS服务器 DNS,全称Domain Name System,即域名解析系统,帮助用户在互联网上寻找路径,它在互联网的作用是把域名转换成为网络可以识别的IP地址. 国外DNS服务器地址: ...
- Handler知识点详解
Handler是在多线程之间使用的,用于线程之间进行通信. 要想知道为什么需要Handler就首先说明android的主线程和工作线程. 主线程又称为UI线程.正是因为在android中,所有与UI有 ...
- [html] Quirks Standards
[产生] Standards : 从IE6开始,引入了Standards模式 Quirks : 在IE6之前CSS还不够成熟,所以IE5等之前的浏览器对CSS的支持很差,为了兼容ie5之前的页面, ...
- stdlib标准库的常用API
iOS 有如下四种随机数方法,下面以产生 [0,100) 的随机数为例: 1. srand((unsigned)time(0)); //不加这句每次产生的随机数不变 int i = rand() % ...
- hiho_1058_combination_lock
题目大意 给定N个字符,范围为A-Z,编号为1-N,对该字符序列进行M个操作,操作有4中类型: (1)CMD 1 i j X 将[i, j]区间内的字符均变为X (2)CMD 2 i j K ...
- 使用升级助 升级了win10,黑屏,无桌面 解决方案
使用U盘重装即可. 事实证明,win10升级助手实在不咋地 优待又2: (1)保留原win7系统,有后悔药: (2)原系统的软件可用: 缺点: (1)装得慢,一上午: (2)开机慢,三分半 (3)开机 ...