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

移动开发
本文介绍的是如何使Qt平台中GUI保持响应流畅,在QT平台中是否可以通过多线程以外的方法来提高响应速度呢?本文给你解决。

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

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

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

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

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

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

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

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

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

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

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

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

QT平台中注册系统空闲事件的方法可以通过QTimer::singleShot(0,this,SLOT(calculate()));将系统空闲信号注册到自己的槽中。或者使用QMetaObject::invokeMethod(this,"calculate",Qt::QueuedConnection);方法,通过invokeMethod异步的执行某个方法。

***重点看一下如何减少响应的时间,对于数据密集型操作,推荐使用ThreadPool来管理,减少线程上下文切换的时间;而对于IO密集型操作,则自己管理一个thread来实现,而这也是我认为thread最应该使用的情景,即让CPU和外设都处于满负荷运转状态,减少总的操作时间。

对于并行操作响应时间的减少,在QT平台中引入了QtConcurrent的概念,采用Map/Reduce的方式,具体可以参考QT平台中的ConcurrentProgramming节。

***再解答下如何在QT平台中将异步操作改成同步操作的方法,这个就属于QTspecial的内容,一般的读者可以跳过。

具体的代码如下所示:

  1. QNetworkAccessManagermanager;  
  2. QEventLoopq;  
  3. QTimertT;  
  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);//5stimeout  
  10. q.exec();  
  11. if(tT.isActive()){  
  12. //downloadcomplete  
  13. tT.stop();  
  14. }else{  
  15. //timeout  

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

小结:如何使Qt平台GUI保持响应流畅的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-06-09 16:18:25

Qt GUI

2015-12-01 09:02:58

ios界面流畅

2011-08-17 10:09:25

iPhone开发UIWebViewTouch事件

2023-10-10 09:23:52

开源Pomatez

2020-02-24 08:00:20

云的计算解决方案虚拟机

2010-07-22 08:42:04

Eclipse平台中P

2014-05-09 15:43:39

移动安全Android安全

2010-05-04 13:41:04

Unix平台

2010-05-14 14:07:38

VMwareXen

2022-06-08 08:23:18

低代码无代码网络安全

2022-07-05 07:02:59

iOS 系统安卓墓碑机制

2011-09-05 15:09:06

Android平台Phonegap

2010-07-05 16:25:13

IPX SPX协议

2023-10-16 18:51:04

ClickHouse大数据

2010-05-20 13:30:26

MySQL代码

2010-06-22 16:19:01

Black Berry

2011-09-06 13:31:10

MTK平台Scatter文件

2011-09-06 16:00:08

QT平台静态库

2009-12-18 14:53:35

Junos网络操作系统

2017-12-24 21:53:56

数字化客户触点移动应用
点赞
收藏

51CTO技术栈公众号