2013-07-30 29 views
1

我使用的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()我需要傳遞當前應用程序的副本,但不能被醃製,因此它看起來不起作用。更多的建議表示讚賞。 –

回答

1

蟒蛇讓絕對確保有在線程沒有 GUI交互 - 在GUI中,也不直接線程交互。 GUI可以調用線程中的setter函數,該函數更改線程定期檢查的成員值,並且線程可以通過發佈事件以及其他數據來導致GUI結果。

一個wxPython的可愛的特點是,自定義事件可以攜帶任何類型的針對自己的數據的。

Queue的一個特點是,如果插槽已滿,它將掛起,而當您的GUI正在執行菜單點擊等操作時,您將不會爲您的隊列提供服務我懷疑您正在滿溢 - 您應該抓住完全的例外和做丟棄數據和設置數據丟失標誌。

+0

感謝您的回答。線程與外部的唯一通信是通過queue.put(...)調用。因爲我不認爲這些是指針,所以採集模塊中的每一點數據都應該與gui中的任何數據分開。傳遞的唯一其他數據位在一個設置模塊中,但我相信這些數據是醃漬的和未剔除的(如此複製而不是指針),並且在捕獲過程中它們當然不會被修改。 –

+0

請參閱擴展的答案@kezz_smc。 –

+0

謝謝!你的回答讓我意識到我是一個白癡,採集模塊是線程化的,但從它那裏接收數據的模塊不是,這意味着它阻止了gui。現在全部修好了。 –

相關問題