1

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

当调用循环收集数据时,显然gui阻塞了,所以我使用threading.Thread将采集模块放在单独的线程中。然而,数据来得如此之快,以至于我们实际上需要多个内核,我相信 threading.Thread 做不到。

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

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

数据被发送到队列中

queue.put( (i, j, c, aiData.value) )

并再次拿起

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

现在奇怪的是,在我可以更新主 wx.Frame 上的一些 pyplot 图的意义上,gui 并没有阻塞,但是与它的任何交互(单击菜单等)都会立即导致程序变得无响应并崩溃. 有谁知道为什么会这样,或者任何解决方法?

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

4

1 回答 1

1

确保线程没有GUI 交互 - GUI 中也没有直接的线程交互。GUI 可以在线程中调用 setter 函数来更改线程定期检查的成员值,并且线程可以通过发布事件和附加数据来导致 GUI 结果。

wxPython 的一个可爱特性是自定义事件可以为您携带任何类型的数据。

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

于 2013-07-30T19:32:59.167 回答