2

我正在尝试使用 wxPython 实现观察者设计模式。我有一个在后台计算大量数据的建模应用程序。有时我想在 GUI 中显示模型的输出——这只是一个由不同颜色的正方形组成的网格。其他时候我需要在不显示 GUI 的情况下进行计算。

观察者模式的优点是您可以通过添加或删除一行代码来插入或不插入 GUI,例如

self.observers.append(MyWxGui())

或类似的。现在,要做到这一点,我需要我的计算在一个线程上运行,而 wx GUI 在另一个线程上运行。我尝试使用 wxPython 执行此操作,但总是收到致命的 I/O 错误:

python: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.0.

我阅读了 wxPython 中的多线程教程,例如http://wiki.wxpython.org/LongRunningTasks,但它们都在主线程中运行 Mainloop() 而不是在辅助线程中运行长时间运行的任务,而我需要它反过来。这是因为如果我在主线程中有 Mainloop(),程序会挂起等待来自 GUI 的某些事件,而不是继续计算。

我还看到我无法在子线程中操作设备上下文 (DC),例如 ClientDC 或 PaintDC,但我在同一个线程中运行整个 wx 代码。

Mainloop() 和所有 wx GUI 可以在它自己的线程中运行,而不是主应用程序的线程吗?

在 Ubuntu 10.10 maverick 上运行 wxPython 2.8.11.0。

4

1 回答 1

3

如果您阅读了该 wiki 页面,那么您应该知道您可以使用 wx.CallAfter、wxCallLater 或 wx.PostEvent 以线程安全的方式与 wx 线程进行通信。我在这里有一个简单的教程:

http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

就个人而言,我会使用类似 Pubsub + 上面提到的线程安全方法之一与 wx MainLoop 进行通信。Pubsub 的好处是它可以监听消息并适当地对它们做出反应。上面的示例实际上显示了一种方法来做到这一点。希望这会帮助你。否则,我强烈建议加入 wxPython 邮件列表并在那里询问:http ://groups.google.com/group/wxpython-users/topics?pli=1

于 2010-12-06T15:00:15.053 回答