Keeping the GUI Responsive
原文作者: Witold Wysota
译者: Jason Lee @ http://blog.csdn.net/jasonblog
在 QtCentre 里的人们经常提到一个反复出现的问题:长操作期间 GUI 界面无响应。这个问题不难解决,并且有多种应对方案,因此我在这里列出一些针对不同情况的可能的解决方案。
长操作
第一件事是列出这个问题域并且列出可以采取的解决方案。前面涉及的这个问题可能以两种形式出现。第一种情况是程序在执行计算密集型任务,也就是需要经过一系列操作才能得到最后的结果。比如快速傅里叶变换。
另一种情况是程序必须在已经触发的活动(比如从网络上下载东西)结束后才能继续算法的下一步。这种情况,就本身而言,通过使用 Qt 是比较容易避免的,因为大多数的异步操作在 Qt 中可以采用信号和槽的机制来实现,所以你可以将之连接到一个槽中来继续算法的下一步。
在计算过程中(无论以何种方式使用信号和槽)所有的事件处理都会被暂停。因此, GUI 不会被刷新,用户输入不会被处理,网络活动停止以及定时器不运作——程序看起来被冻结了并且,事实上,程序中不耗时的那部分也被冻结了。“长操作”是多长呢?任何使得程序无法即时响应用户的事情都算长。一秒钟是长,任何超过两秒钟的操作肯定太长了。
本文旨在保持程序功能,防止终端用户被一个不响应的 GUI (以及网络和定时器)所惹恼。为了做到这个目标首先需要看看可能的解决方案和问题的主因。
我们可以通过两种方式来获取计算型任务的结果——通过在主线程(单一线程方案)或者在单独的线程