2016-04-08 279 views
3

我正在使用OpenCV開展動物跟蹤計劃。當動物被識別時,我想繪製一些形狀並將它們投射在它前面幾秒鐘。 對於繪製形狀和投影它們我正在使用PsychoPy線程停止應用程序

當我得到動物並用PsychoPy調用draw函數時,程序凍結,直到形狀消失。我使用了Threading來解決這個問題,但程序完全停止了,系統提示「Python意外退出」。

這裏是我正在打開線程:

t = threading.Thread(target=stimulus_controller.draw, args=(stimulus_view, 20)) 
t.setDaemon(True) 
t.start() 

其中stimulus_view是我要畫形狀的陣列,以及20秒,顯示刺激的數量。

這是繪圖代碼:

def draw(stims, time): 

    trialClock = core.Clock() 

    while t < time: 
     t = trialClock.getTime() 
     for s in stims: 
      s.draw() 

     myWin.flip() 

這很簡單,但它一直意外停止!

非常感謝。

+0

嘗試從工作人員創建窗口,而不是從主線程創建窗口 – Tibo

+0

是的,它確實有意義! 我會直接嘗試。謝謝 –

+0

它工作完美:D 非常感謝您的幫助。 –

回答

3

一般而言,窗口工具包不喜歡從不同線程中使用(這主要是由於解除操作系統工作的方式),而PsychoPy也不例外。它並不總是被記錄下來,但是通常可以在線程中使用它們,只要一個線程(主線程或工作線程)與窗口交互即可。

與窗口「交互」基本上有三件事:創建它,繪製它並向其發送/接收事件。在你的例子中,你從工作者線程中繪製,但是你已經從主線程創建了窗口 - 因此它崩潰了。

如果你從你的工作線程創建窗口,你應該沒問題。此外,如果您打算使用事件,則只能從工作人員(一些工具包,例如wxWidgets,有原語允許其他線程發送事件,有些需要您使用例如隊列來完成管道工作)來完成此操作。

+0

完美解釋:D 非常感謝。 –