wxpython —线程和窗口事件
问题内容:
我有一个wxPython应用程序(http://www.OpenSTV.org),该应用程序使用具有多个回合的方法来计算选票。我想做两件事:
(1)对于大量投票,这可能会有点慢,所以我想向用户显示一个进度对话框,这样他就不会认为应用程序被冻结了。
(2)我想允许用户手动断开联系,这需要计数代码才能显示对话窗口。
为了实现(1),我创建了一个线程来运行计数代码,这使我可以向用户展示一个不错的进度对话框。
但是,这样做的问题是计数代码不是主线程,只有wxPython中的主线程才能处理窗口事件。
我想我可以创建一个线程来运行进度对话框,但这似乎很尴尬。是否有更好的方法同时完成(1)和(2)?
问题答案:
使用Queue在线程之间进行通信和同步,每个线程都“拥有”并专门与不方便共享的资源进行交互。
在只有主线程才能真正处理GUI的GUI工具箱中,主线程应随心所欲-
设置并启动执行实际工作的线程,然后仅执行GUI工作,使用Queue与其他线程进行通信,或从其他线程进行通信。
对于(1),当计数线程有更新时,应将put
其更新到主线程正在等待的队列;当您的主线程在该队列上收到适当的消息时,它将更新进度对话框。
对于(2),计数线程发送“让用户打平领带”请求,主线程获取该请求并作出适当响应,然后在单独的Queue上发回分辨率。
因此,通常有两种通信方式:一种不需要响应,而另一种则需要。对于前一种,只需将通知放在适当的队列上,然后继续进行即可-
它将在适当的时候进行处理。对于后一种,我最喜欢的习惯用法是将适当的队列放入一对(request,response_queue)。如果相同的请求不同,有些请求需要响应而另一些则不需要,则在不需要响应时排队(请求,无)(和(请求,q)在需要响应时q是队列),这很容易,以及一般用语。