在应用程序执行一些CPU繁重处理时保持GUI响应是有效GUI编程的挑战之一.
这里有一个很好的讨论如何在wxPython中执行此操作.总而言之,有3种方式:
使用线程
使用wxYield
将工作分块并在IDLE事件处理程序中执行
您发现哪种方法最有效?其他框架(如Qt,GTK或Windows API)的技术也很受欢迎.
线程.它们是我一直以来的目标,因为您可以在您需要的每个框架中实现它.
一旦你习惯了在一种语言/框架中进行多线程和并行处理,你就会对所有框架都很擅长.
Definitely threads. Why? The future is multi-core. Almost any new CPU has more than one core or if it has just one, it might support hyperthreading and thus pretending it has more than one. To effectively make use of multi-core CPUs (and Intel is planing to go up to 32 cores in the not so far future), you need multiple threads. If you run all in one main thread (usually the UI thread is the main thread), users will have CPUs with 8, 16 and one day 32 cores and your application never uses more than one of these, IOW it runs much, much slower than it could run.
实际如果你现在计划一个应用程序,我会放弃经典设计并想到主/从关系.您的UI是主要的,它的唯一任务是与用户进行交互.这是向用户显示数据并收集用户输入.每当你的应用程序需要"处理任何数据"(甚至少量和更重要的大数据)时,创建任何类型的"任务",将此任务转发到后台线程并使线程执行任务,向用户界面(例如,已完成的百分比或者任务是否仍在运行,因此用户界面可以显示"正在进行的工作指标").如果可能,将任务拆分为许多小的独立子任务,并运行多个后台进程,为每个子任务提供一个子任务.
事实上,像苹果和微软这样的公司已经开始计划如何让自己的大多数单线程UI自身多线程化.即使采用上述方法,您可能有一天会遇到UI本身就是瓶颈的情况.后台进程可以比UI向用户呈现数据或者询问用户输入更快地处理数据.今天许多UI框架都是线程安全的,许多根本不是线程安全的,但这会改变.串行处理(一个接一个的任务)是一个垂死的设计,并行处理(一次完成许多任务)是未来的发展方向.只需看看图形适配器.即使是最现代的NVidia显卡也具有可怜的性能,如果你只看GPU的MHz/GHz处理速度.在3D计算方面,它如何能够击败CPU?简单:它不是一个接一个地计算一个多边形点或一个纹理像素,而是并行地计算它们中的许多(实际上是一堆同时),并且它达到仍然使CPU哭的吞吐量.例如ATI X1900(也称为竞争对手)有48个着色器单元!