我正在使用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。
答案 0 :(得分:1)
确保 绝对 确保线程中存在无 GUI交互 - 而不是GUI中的直接线程交互。 GUI可以调用线程中的setter函数来更改线程定期检查的成员值,线程可以通过发布事件和其他数据来导致GUI结果。
wxPython的一个可爱功能是自定义事件可以为您提供任何类型的数据。
由于Queue的一个功能是,如果插槽已满,它将挂起,而当您的GUI处理菜单点击等操作时,您将不会为您的队列提供服务我怀疑您正在溢出 - 您应该抓住Full异常并执行诸如丢弃数据和设置数据丢失标记之类的事情。