Qt 平台中使GUI保持响应流畅

如何使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。

时间: 2024-12-17 16:06:07

Qt 平台中使GUI保持响应流畅的相关文章

Java EE 7 教程 第一部分 简介 第1章 概述 第1.8节 Java平台中的Java EE 7 API, 标准版7

原文:http://docs.oracle.com/javaee/7/tutorial/doc/overview008.htm 翻译:石卓林 [email protected] 1.8 Java EE 7 APIs in the Java Platform, Standard Edition 7 Several APIs that are required by the Java EE 7 platform are included in the Java Platform, Standard

(转) unity 在移动平台中,文件操作路径详解

http://www.unitymanual.com/thread-23491-1-1.html 今天,这篇文章其实是个老生常谈的问题咯,在网上类似的文章也比比皆是,在此我只是做个详细总结方便大家能够更好.更快的掌握,当然,如有不足的地方 欢迎指正!!! 相信大家在开发过程中,难免会保存一些文件在客户端进行本地化操作.如:配置文件,状态文件,Assetbundle文件等等... 最近总有人问我:1.保存了一个xml在客户端,能读取里面的数据,可是不能修改,甚至一修改就报错...2.我在电脑上操作

剖析云平台中的“共享型数据库”

摘要: 随着云计算的出现,出现了很多新的名词,像弹性扩容,平缓迁移,资源隔离等.目前我就“共享型数据库”做一下解释,下面就以京东云擎的云数据库为例,给大家剖析什么叫“共享性数据库”.  这个是我第一篇帖子,我首先自我介绍一下,我从事IT行业10年,在多年以前是一名架构师,现在在一家互联网企业做产品经理,下面的仅仅是因为个人与行业一些从业人员交流得到的心得以及总结,有不妥之处请见谅. “共享型数据库”是对比“独享性数据库”的一种针对用户资源所有权的数据库称谓,它是伴随着云计算出来之后的一种数据库创

虚拟化Xen平台中,Dom0和DomU之间发送网络数据时各个部分所运行时间

12年研究Xen的时候,曾经写过很多报告,当时考虑到保密,不能随便发布.现在Xen已经被KVM干的快不行了,发出来供大家参考. 关于xennet_start_xmit <-dev_hard_start_xmit调用函数(notify_remote_via_irq <-xennet_start_xmit)之间时间(0.085313)很长的解释:前端放入请求后,需要根据notify来表明,是否需要向后端发送事件请求.如果后端正在处理请求队列,就不需要向后端发送事件通知(notify=false).

unity 在移动平台中,文件操作路径详解

转载自:http://www.unitymanual.com/thread-23491-1-1.html 今天,这篇文章其实是个老生常谈的问题咯,在网上类似的文章也比比皆是,在此我只是做个详细总结方便大家能够更好.更快的掌握,当然,如有不足的地方 欢迎指正!!! 相信大家在开发过程中,难免会保存一些文件在客户端进行本地化操作.如:配置文件,状态文件,Assetbundle文件等等... 最近总有人问我:1.保存了一个xml在客户端,能读取里面的数据,可是不能修改,甚至一修改就报错...2.我在电

使网站变成响应式的3个简单步骤

如今,一个网站只在桌面屏幕上好看是远远不够的,同时也要在平板电脑和智能手机中能够良好呈现.响应式的网站是指它能够适应客户端的屏幕尺寸,自动响应客户端尺寸变化.在这篇文章中,强创网络工作室将向您展示如何通过3个简单的步骤轻松地使网站变成响应式(Responsive). 1. 布局 当创建一个响应式网站,或让现有的网站变成响应式的,首先要关注的元素的布局.我在建立响应式的网站,总是先创建一个非响应的布局,页面宽度固定大小.如果非响应版本完成得非常不错,我再添加媒体查询(Media Queries)和

寻找丢失的微服务-HAProxy热加载问题的发现与分析 原创: 单既喜 一点大数据技术团队 4月8日 在一点资讯的容器计算平台中,我们通过HAProxy进行Marathon服务发现。本文记录HAProxy服务热加载后某微服务50%概率失效的问题。设计3组对比实验,验证了陈旧配置的HAProxy在Reload时没有退出进而导致微服务丢失,并给出了解决方案. Keywords:HAProxy热加

寻找丢失的微服务-HAProxy热加载问题的发现与分析 原创: 单既喜 一点大数据技术团队 4月8日 在一点资讯的容器计算平台中,我们通过HAProxy进行Marathon服务发现.本文记录HAProxy服务热加载后某微服务50%概率失效的问题.设计3组对比实验,验证了陈旧配置的HAProxy在Reload时没有退出进而导致微服务丢失,并给出了解决方案. Keywords:HAProxy热加载.Marathon.端口重用 01 原文地址:https://www.cnblogs.com/yuanj

Matlab学习---------GUI键盘响应事件的学习

键盘响应事件的学习主要知识: 实例:创建一个GUI,添加两个输入框,一个按钮,实现输入数据之后点击按钮进行验证,验证成功之后关闭当前界面打开新的界面: (1)创建一个新的GUI界面:(添加组件并修改属性) (2)右键按钮添加点击事件响应函数: (3)右键界面,添加键盘按键响应函数: function varargout = gui_key(varargin) % GUI_KEY MATLAB code for gui_key.fig % GUI_KEY, by itself, creates a

移动平台中 meta 标签的使用

一.meta 标签分两大部分:HTTP 标题信息(http-equiv)和页面描述信息(name). 1.http-equiv 属性的 Content-Type 值(显示字符集的设定) 说明:设定页面使用的字符集,用以说明主页制作所使用的文字语言,浏览器会根据此来调用相应的字符集显示 page 内容. 用法: 1 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 注