在wxPython中,当一个单独的线程正在做一些工作时MainThread应该做什么?

时间:2014-07-08 13:28:41

标签: python multithreading wxpython

我有一个绑定到wx.Button对象的OnClick函数,当我单击它时,该函数运行,它创建一个线程并开始在幕后工作。在另一个线程完成后,我应该在MainThread上做什么,以使UI保持响应?我正在做这个(在主线程中):

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

然而,GUI仍然没有响应。我打电话给错了方法吗?

3 个答案:

答案 0 :(得分:1)

你不必做任何事情。只要长时间运行的进程发生在不同的线程中,它就不应该阻止GUI的主循环。有关示例,请参阅以下资源:

如果你看看那些,你会看到你启动一个线程,线程不会阻止UI。

答案 1 :(得分:1)

你的例子

while worker_thread.is_alive():      
    # do something

将阻止您的GUI并占用所有可用的CPU周期,以询问worker_tread它是否仍在工作。如果你阻止主线程,wxPython似乎是不可更新的,即使你用wx.Yield….Update()强制更新也不行。

因此请删除while …声明。您可以执行以下操作来确定旋转线程是否仍然存在:

  • 通过回调主线程并将线程保存wx.CallAfter添加到工作人员的末尾来表示线程结束
  • 安装wx.Timer(例如,每1000毫秒),如果它仍然存在,则轮询worker_thread

答案 2 :(得分:0)

我建议您使用wx.CallAfter()。您可以找到一些有用的示例here。您还可以使用pubsub模块向GUI发送消息。然后您的GUI将不会因其他线程而阻塞。

Here是一个不错的博客,当我遇到类似你的问题时,我会读到这个博客。 您还可以在SO上找到一些其他问题,这些问题可以帮助您理解这一概念herehere,& here