在wxPython中,主线程在其他线程工作时应该做什么?
我有一个点击事件函数,它绑定在一个wx.Button按钮上。当我点击这个按钮时,这个函数就会被执行,它会创建一个线程,然后在后台开始工作。那么在这个线程完成工作的时候,我应该在主线程中做些什么,才能让界面保持响应呢?现在我在主线程中做的是这个:
worker_thread = Thread(target = self.DoWork, name = "Solo Worker Thread")
worker_thread.start()
while worker_thread.is_alive():
self.Update() #self being the class that inherits wx.Panel
但是界面还是没有反应。我是不是调用了错误的方法?
3 个回答
1
你不需要做什么。只要长时间运行的过程在一个不同的线程中进行,它就不会阻塞图形界面的主循环。你可以看看以下资源,里面有例子:
- http://wiki.wxpython.org/LongRunningTasks
- http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/
如果你查看这些内容,你会发现你可以启动一个线程,而这个线程不会阻塞用户界面。
1
你的例子
while worker_thread.is_alive():
# do something
会让你的图形界面(GUI)卡住,并且会占用所有可用的CPU资源去询问worker_thread
是否还在工作。如果你阻塞了主线程,wxPython似乎就无法更新,即使你强制使用wx.Yield
或….Update()
来更新也不行。
所以,建议你删除while …
这个语句。你可以通过以下方法来判断分离出来的线程是否还在运行:
- 通过在工作线程结束时调用主线程的线程安全的
wx.CallAfter
来发出信号 - 安装一个
wx.Timer
(比如每1000毫秒)来定期检查worker_thread
是否还活着