使用wxPython进行多处理是没有响应的

时间:2013-07-30 15:36:26

标签: python user-interface wxpython multiprocessing

我正在使用wxPython作为数据采集系统的前端,后端使用PyDAQmx连接到国家仪器卡。

当调用循环来收集数据时,显然gui会阻塞,所以我使用threading.Thread将获取模块放在一个单独的线程中。但是,数据速度如此之快,以至于我们实际上需要不止一个核心,我认为它是线程化的。线程无法做到。

我接下来尝试使用multiprocessing来生成一个单独的进程.Process&排队报告数据,非常简单地作为

captureProcess = Process(target=acquire, args=(self.settings, self.queue,))
captureProcess.start()

使用

将数据发送到队列中
queue.put( (i, j, c, aiData.value) )

然后再次拿起

(scan, interval, count, ai) = queue.get()

现在奇怪的是,gui没有阻止,因为我可以更新主wx.Frame上的一些pyplot图形,但是与它的任何交互(点击菜单等)会立即导致程序变为没有反应和崩溃。有谁知道这可能是什么,或任何解决方法?

非常感谢你的帮助。我在Windows 7上使用anaconda。

1 个答案:

答案 0 :(得分:1)

确保 绝对 确保线程中存在 GUI交互 - 而不是GUI中的直接线程交互。 GUI可以调用线程中的setter函数来更改线程定期检查的成员值,线程可以通过发布事件和其他数据来导致GUI结果。

wxPython的一个可爱功能是自定义事件可以为您提供任何类型的数据。

由于Queue的一个功能是,如果插槽已满,它将挂起,而当您的GUI处理菜单点击等操作时,您将不会为您的队列提供服务我怀疑您正在溢出 - 您应该抓住Full异常并执行诸如丢弃数据和设置数据丢失标记之类的事情。