ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

保持Qt程序中GUI的响应流畅

2020-04-19 22:02:57  阅读:292  来源: 互联网

标签:流畅 Qt GUI 响应 操作 执行 方法


保持Qt程序中GUI的响应流畅

来源 https://my.oschina.net/shelllife/blog/50813

 

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

 

=============== End

 

标签:流畅,Qt,GUI,响应,操作,执行,方法
来源: https://www.cnblogs.com/lsgxeva/p/12734033.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有