我使用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()现在,奇怪的一点是,gui不阻止我可以在主wx.Frame上更新一些pyplot图,但是与它的任何交互(单击菜单等)都会立即导致程序失去响应和崩溃。有没有人知道为什么会这样,或者有什么解决办法?
非常感谢你的帮助。我在Windows 7上使用anaconda。
发布于 2013-07-30 19:32:59
让绝对确保在线程中没有,没有 GUI交互,在GUI中也没有直接的线程交互。GUI可以调用线程中的setter函数来更改线程定期检查的成员值,并且线程可以通过提交事件和附加数据来导致GUI结果。
wxPython的一个可爱特性是,自定义事件可以为您携带任何类型的数据。
队列的一个特性是,如果插槽满了,它就会挂起,当GUI处理菜单单击之类的事情时,您将不会为您的队列提供服务,我怀疑您已经溢出了--您应该捕捉到完全的异常,并做一些类似于丢弃数据和设置数据丢失标志的操作。
https://stackoverflow.com/questions/17951402
复制相似问题