如何使Qt 平台中的GUI保持响应流畅?一般来说耗时较长的操作,分为计算密集型操作和IO密集型操作,对于这两类操作如何提高响应速度。

而从操作的本质上来说,操作又可分为不可分解操作,如在第三方库中耗时较长的操作,以及可分解操作,其中可分解操作又可细分为串行操作和可并行操作,如何针对这几类操作来提高响应速度呢?

如何将异步的操作,如网络库中异步的读取数据方法,变成同步的操作?

此外对于多线程,普遍的看法是可以提供程序的运行速度,其实不然,不正确地使用线程常常会使程序变慢,那么在QT中是否可以通过多线程以外的方法来提高响应速度呢?本文给你解决。

首先什么是对GUI的响应?答:GUI的响应就是系统对于GUI事件的处理速度。

由于系统处理事件需要一定的时间,所以一般窗口系统都会提供一个事件队列来存储事件。如果把每个事件处理看成一个任务的话,那么事件处理就类似于操作系统对于任务按照优先级进行处理,使得每个任务的平均等待时间最小。那么就可以借鉴一下操作系统中的方法,比如:

分级,让较长的任务延后执行。

分时,对于较长的任务,让其执行一段时间后暂停,然后再执行。

减少每个任务运行的耗时,当然这是最基本的方法。

先看第一个分级,当一个事件处理程序知道自己将执行耗时很长的操作时,可以调用QCoreApplication::processEvents() 方法,等待消息队列中的方法都执行完再执行。当然这是一个最基本的方法,只适用与简单的情况,如果事件队列中的另一程序也调用了该方法则会出现死锁。

再看分时,它适用于可分解的操作(包括串行操作和并行操作),只需记录当前任务的执行情况,然后可以再次执行。它的使用流程如下:

  1. Function EventHandler()
  2. {
  3. //开始计时
  4. While(执行时间 < 用户可接受的响应时间)
  5. {
  6. //执行操作: }
  7. //注册系统空闲事件以继续处理
  8. }

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的内容,一般的读者可以跳过。

具体的代码如下所示:

  1. QNetworkAccessManager manager;
  2. QEventLoop q;
  3. QTimer tT;
  4. tT.setSingleShot(true);
  5. connect(&tT, SIGNAL(timeout()), &q, SLOT(quit()));
  6. connect(&manager, SIGNAL(finished(QNetworkReply*)),
  7. &q, SLOT(quit()));
  8. QNetworkReply *reply = manager.get(QNetworkRequest(QUrl("http://www.qtcentre.org")));
  9. tT.start(5000); // 5s timeout
  10. q.exec();
  11. if(tT.isActive()){
  12. // download complete
  13. tT.stop();
  14. } else {
  15. // timeout
  16. }

其中主要利用了QEventLoop类,它将创建一个本地的Event loop,然后block,直到接受到finished信号,或者timeout超时信号后才退出,而事件循环则不会被block。

qt 提高ui响应度的更多相关文章

  1. iOS开发之多种Cell高度自适应实现方案的UI流畅度分析

    本篇博客的主题是关于UI操作流畅度优化的一篇博客,我们以TableView中填充多个根据内容自适应高度的Cell来作为本篇博客的使用场景.当然Cell高度的自适应网上的解决方案是铺天盖地呢,今天我们的 ...

  2. 转:iOS开发之多种Cell高度自适应实现方案的UI流畅度分析

    本篇博客的主题是关于UI操作流畅度优化的一篇博客,我们以TableView中填充多个根据内容自适应高度的Cell来作为本篇博客的使用场景.当然Cell高度的自适应网上的解决方案是铺天盖地呢,今天我们的 ...

  3. qt中ui的 使用介绍

    1.什么是ui?ui通常是用Qt 设计师设计出来的界面文件的后缀.通常情况下ui是一个指向这个界面类的指针.ui-> 一般就是用来访问这个界面类里面的控件.例如你的ui文件里有一个叫okButt ...

  4. Qt中Ui名字空间以及setupUi函数的原理和实现 <转>

    用最新的QtCreator选择GUI的应用会产生含有如下文件的工程 下面就简单分析下各部分的功能. .pro文件是供qmake使用的文件,不是本文的重点[不过其实也很简单的],在此不多赘述. 所以呢, ...

  5. QT在ui文件上建立信号操机制会不会对后期维护产生影响 - love4Mario的专栏 - 博客频道 - CSDN.NETQT在ui文件上建立信号操机制会不会对后期维护产生影响 - love4Mario的专栏 - 博客频道 - CSDN.NET

    QT在ui文件上建立信号操机制会不会对后期维护产生影响 - love4Mario的专栏 - 博客频道 - CSDN.NET QT在ui文件上建立信号操机制会不会对后期维护产生影响 分类: 学习心得 2 ...

  6. Qt中Ui名字空间以及setupUi函数的原理和实现

    用最新的QtCreator选择GUI的应用会产生含有如下文件的工程 下面就简单分析下各部分的功能. .pro文件是供qmake使用的文件,不是本文的重点[不过其实也很简单的],在此不多赘述. 所以呢, ...

  7. 前端设计师如何提高UI界面中的阅读性

    阅读体验是ui设计中必不可少的一项,良好的设计应该都是可读的设计,如果信息都无法正常而清晰的传达,那么设计就失去了意义.设计的可读性和排版设计息息相关,这也就跟设计师的设计功底息息相关.下面简单介绍文 ...

  8. 风险案例-28期-项目Leader与团队成员缺乏沟通,问题响应度较慢导致团队士气低落,工作效率低

    典型案例: A公司某C类项目目前进入开发高峰期,项目组的三个leader预计在项目的实际task投入占比为70%,剩30%工作时间用于指导组员进行作业实施并担当部分管理工作.从项目实施过程中发现Lea ...

  9. 提高UI设计效率的4个技巧

    提高UI设计效率的4个技巧 如何提高UI设计的速度?在这里分享一些我观察到的常见问题和改善方式.当然,需要注意的地方何其多. 身为设计师的你,应该要了解工程实作的基本原理: 业界 NG 率:接近 10 ...

随机推荐

  1. c How to Make an Ascii Picture.

    import java.io.*; public class trans{ public static void main(String[] args){ try{ File inFile = new ...

  2. Git 的origin和master分析 push/diff/head(转)

    1.origin/master : 一个叫 origin 的远程库的 master 分支 2.HEAD指向当前工作的branch,master不一定指向当前工作的branch 3.git  push ...

  3. The specified child already has a parent错误

    10-05 23:39:48.187: E/AndroidRuntime(12854): Caused by: java.lang.IllegalStateException: The specifi ...

  4. Java 文件IO

    文件IO Java IO    IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中    按操作数据分为 字节流和字符流        字符流的 ...

  5. iOS——为Xcode编译POCO C++静态库

    一.POCO C++ library简介 POCO C++ library是一个C++编写的跨平台库,主要实现网络连接.数据库管理以及服务器,适用于跨平台.嵌入式. 二.为Xcode编译POCO C+ ...

  6. OpenGL的glScalef缩放变换函数详解

    glScalef是openGL中的模型缩放函数,就是把当前矩阵与一个表示延各个轴对物体进行拉伸.压缩.反射的矩阵相乘.这个物体的每个点的x,y,z坐标与对应的xyz参数相乘. 先看函数定义void g ...

  7. OpenGL的gluLookAt观察变换函数详解

    void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez,                          GLdouble center ...

  8. aliyun CentOS6.5 上 svn 安装笔记

    为了方便管理自己的一些学习资料.总结等,在CentOS6.5上安装SVN,记录过程如下: 1.1  安装方式  独立服务器  fsfs SVN服务器有2种运行方式:独立安装.SVN+Apache.独立 ...

  9. SpringMVC简单构造restful, 并返回json

    https://my.oschina.net/u/2272916/blog/352297

  10. JavaScript高阶函数的应用

    定义 高阶函数是指至少满足下列条件之一的函数: 函数可以作为参数被传递: 函数可以作为返回值输出. JavaScript语言中的函数显然满足高阶函数的条件,在实际开发中,无论是将函数当作参数传递,还是 ...