设为首页 加入收藏

TOP

如何保持GUI的响应流畅(QT平台)
2014-11-05 14:30:07 】 浏览:288
Tags:如何 保持 GUI 响应 流畅 平台

  引子


  一般来说耗时较长的操作,分为计算密集型操作和IO密集型操作,对于这两类操作如何提高响应速度呢?


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


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


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


  下文将一一解答这些问题。


  正文


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


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


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


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


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


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


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


  1: Function EventHandler()


  2: {


  3: //开始计时


  4: While(执行时间 < 用户可接受的响应时间)


  5: {


  6: //执行操作


  7: }


  8: //注册系统空闲事件以继续处理


  9: }


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


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++的指针和引用参数 下一篇C++学习中遇到的两个问题

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目