线程会停止应用程序

时间:2016-04-08 07:53:45

标签: python multithreading opencv psychopy

我正在与OpenCV合作开展动物追踪计划。当动物被识别出来时,我想绘制一些形状并将它们投射到它前面一定的秒数。 为了绘制形状并投影它们,我使用的是PsychoPy

当我得到动物并用PsychoPy调用绘图功能时,程序会冻结,直到形状消失。我使用线程来解决这个问题,但程序完全停止,系统消息显示" 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()

这很简单但却意外停止了!

非常感谢。

1 个答案:

答案 0 :(得分:3)

通常,窗口工具包不喜欢从不同的线程中使用(这主要是由于底层操作系统的工作方式),而PsychoPy也不例外。它并不总是记录在案,但通常可以将它们与线程一起使用,只要一个线程(无论是主线程还是工作线程)与窗口交互。

&#34;相互作用&#34;窗口基本上是三件事:创建窗口,绘制窗口,以及向/从中发送/接收事件。在您的示例中,您从工作线程绘制,但您已从主线程创建窗口 - 因此它崩溃。

如果从工作线程中创建窗口,那么你应该没问题。此外,如果您打算使用事件,请仅从工作人员执行此操作(某些工具包,例如wxWidgets,具有允许其他线程发送事件的原语,有些需要您使用例如队列进行管道连接)。