在长时间运行任务期间保持GUI响应性
在应用程序进行一些需要大量计算的处理时,保持界面(GUI)响应迅速是有效的图形界面编程中的一个挑战。
这里有个不错的讨论,讲述了如何在wxPython中做到这一点。简单来说,有三种方法:
- 使用线程
- 使用wxYield
- 将工作分块,并在空闲事件处理器中进行处理
你觉得哪种方法最有效呢?其他框架(比如Qt、GTK或Windows API)中的技巧也欢迎分享。
9 个回答
我觉得你要找的东西是 delayedresult
:
http://www.wxpython.org/docs/api/wx.lib.delayedresult-module.html
可以看看 wxpython 的示例演示,里面有个例子。
绝对是线程。为什么呢?未来是多核的。几乎所有的新CPU都有多个核心,或者即使只有一个核心,它也可能支持超线程技术,假装有多个核心。为了有效利用多核CPU(而且英特尔计划在不久的将来推出32核的CPU),你需要多个线程。如果你所有的操作都在一个主线程中运行(通常用户界面线程就是主线程),那么用户的CPU可能有8个、16个,甚至将来有32个核心,而你的应用程序却只使用了其中一个,也就是说,它的运行速度会比它本可以更快的速度慢得多。
实际上,如果你现在计划一个应用程序,我建议你放弃传统的设计,考虑主从关系。用户界面是主控,它的唯一任务就是与用户互动。也就是说,显示数据给用户并收集用户输入。每当你的应用需要“处理任何数据”(即使是小量数据,更重要的是大数据),就创建一个“任务”,把这个任务交给一个后台线程去执行,并向用户界面反馈进度(例如,完成了多少百分比,或者任务是否还在进行中,这样用户界面就可以显示“正在进行”的指示)。如果可能的话,把任务拆分成许多小的、独立的子任务,并运行多个后台进程,每个进程处理一个子任务。这样,你的应用程序就能真正受益于多核处理器,核心越多,速度就越快。
实际上,像苹果和微软这样的公司已经在计划如何让他们目前大多数是单线程的用户界面变成多线程的。即使采用上述方法,你可能有一天会发现用户界面本身就是瓶颈。后台进程处理数据的速度可能远远快于用户界面向用户展示数据或请求用户输入的速度。如今,许多用户界面框架线程安全性较差,很多根本不安全,但这会有所改变。串行处理(一个任务接一个任务地处理)正在逐渐消亡,而并行处理(同时处理多个任务)才是未来的方向。看看图形适配器就知道了。即使是最新的NVIDIA显卡,单看GPU的处理速度(以MHz/GHz计)也显得很可怜。但为什么在3D计算方面它能打败CPU呢?简单:它不是一个接一个地计算多边形的点或纹理的像素,而是同时计算很多个,实际上是一次性处理一大堆,这样它的吞吐量就能让CPU都感到无奈。例如,ATI X1900(也提一下竞争对手)就有48个着色单元!
线程。它们是我总是选择的,因为在你需要的每个框架中都可以使用它们。
而且一旦你习惯了在某种语言或框架中使用多线程和并行处理,那么在其他框架中也能轻松上手。