2016-04-08 159 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 非常感谢。 –