处理界面卡死的方法

本文探讨了在执行长操作时如何保持Qt应用程序的GUI响应性,包括通过周期性调用QCoreApplication::processEvents()进行人工事件处理,使用QThread进行多线程操作,以及利用QEventLoop等待异步任务结束。文章提供了各种解决方案的优缺点和适用场景,以防止程序在执行计算密集型任务或等待网络操作时冻结。
摘要由CSDN通过智能技术生成

Keeping the GUI Responsive

原文作者: Witold Wysota

译者: Jason Lee @ http://blog.csdn.net/jasonblog

在 QtCentre 里的人们经常提到一个反复出现的问题:长操作期间 GUI 界面无响应。这个问题不难解决,并且有多种应对方案,因此我在这里列出一些针对不同情况的可能的解决方案。

长操作

第一件事是列出这个问题域并且列出可以采取的解决方案。前面涉及的这个问题可能以两种形式出现。第一种情况是程序在执行计算密集型任务,也就是需要经过一系列操作才能得到最后的结果。比如快速傅里叶变换。

另一种情况是程序必须在已经触发的活动(比如从网络上下载东西)结束后才能继续算法的下一步。这种情况,就本身而言,通过使用 Qt 是比较容易避免的,因为大多数的异步操作在 Qt 中可以采用信号和槽的机制来实现,所以你可以将之连接到一个槽中来继续算法的下一步。

在计算过程中(无论以何种方式使用信号和槽)所有的事件处理都会被暂停。因此, GUI 不会被刷新,用户输入不会被处理,网络活动停止以及定时器不运作——程序看起来被冻结了并且,事实上,程序中不耗时的那部分也被冻结了。“长操作”是多长呢?任何使得程序无法即时响应用户的事情都算长。一秒钟是长,任何超过两秒钟的操作肯定太长了。

本文旨在保持程序功能,防止终端用户被一个不响应的 GUI (以及网络和定时器)所惹恼。为了做到这个目标首先需要看看可能的解决方案和问题的主因。

我们可以通过两种方式来获取计算型任务的结果——通过在主线程(单一线程方案)或者在单独的线程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CTA定量交易策略

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值