多与wxPython的是反应迟钝

问题描述:

我使用的wxPython作为一个数据采集系统的前端,使用PyDAQmx后端接口的民族乐器卡。多与wxPython的是反应迟钝

当循环调用来收集数据,显然贵块,所以我用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

+0

尝试启动过程的早期阶段 - 建立wxPython的之前。推向数据收集过程的状态越少越好。 – tdelaney

+0

你有没有尝试在循环中并入wx.Yield()?这将允许GUI更新,然后返回到循环。你可能不需要使用它来将它解出来,但是我又没有使用anaconda,所以我不确定它会做什么。 –

+0

感谢您的帮助。我无法尽早启动此过程,因为它需要在用户开始数据捕获时启动。由于循环是在单独的过程中,对于wx.Yield()我需要传递当前应用程序的副本,但不能被腌制,因此它看起来不起作用。更多的建议表示赞赏。 –

蟒蛇让绝对确保有在线程没有 GUI交互 - 在GUI中,也不直接线程交互。 GUI可以调用线程中的setter函数,该函数更改线程定期检查的成员值,并且线程可以通过发布事件以及其他数据来导致GUI结果。

一个wxPython的可爱的特点是,自定义事件可以携带任何类型的针对自己的数据的。

Queue的一个特点是,如果插槽已满,它将挂起,而当您的GUI正在执行菜单点击等操作时,您将不会为您的队列提供服务我怀疑您正在满溢 - 您应该抓住完全的例外和做丢弃数据和设置数据丢失标志。

+0

感谢您的回答。线程与外部的唯一通信是通过queue.put(...)调用。因为我不认为这些是指针,所以采集模块中的每一点数据都应该与gui中的任何数据分开。传递的唯一其他数据位在一个设置模块中,但我相信这些数据是腌渍的和未剔除的(如此复制而不是指针),并且在捕获过程中它们当然不会被修改。 –

+0

请参阅扩展的答案@kezz_smc。 –

+0

谢谢!你的回答让我意识到我是一个白痴,采集模块是线程化的,但从它那里接收数据的模块不是,这意味着它阻止了gui。现在全部修好了。 –