Python 线程停止应用程序

Python 线程停止应用程序,python,multithreading,opencv,psychopy,Python,Multithreading,Opencv,Psychopy,我正在用OpenCV开发一个动物追踪程序。当动物被认出来时,我想画一些形状,并在它面前投射一定的时间。 用于绘制形状和投影它们,我正在使用 当我得到动物并用PsychoPy调用draw函数时,程序冻结,直到形状消失。我使用线程来解决这个问题,但程序完全停止,系统消息显示“Python意外退出” 以下是我如何打开线程: t = threading.Thread(target=stimulus_controller.draw, args=(stimulus_view, 20)) t.setDaemo

我正在用OpenCV开发一个动物追踪程序。当动物被认出来时,我想画一些形状,并在它面前投射一定的时间。 用于绘制形状和投影它们,我正在使用

当我得到动物并用PsychoPy调用draw函数时,程序冻结,直到形状消失。我使用线程来解决这个问题,但程序完全停止,系统消息显示“Python意外退出”

以下是我如何打开线程:

t = threading.Thread(target=stimulus_controller.draw, args=(stimulus_view, 20))
t.setDaemon(True)
t.start()
其中,刺激_视图是我想要绘制的形状数组,20是显示刺激的秒数

这是图纸代码:

def draw(stims, time):

    trialClock = core.Clock()

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

        myWin.flip()
def绘制(刺激、时间):
trialClock=core.Clock()
当t<时间:
t=trialClock.getTime()
对于STIM中的s:
s、 画()
myWin.flip()
它很简单,但总是意外地停止


非常感谢。

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

与窗口的“交互”本质上是三件事:创建窗口、引入窗口以及向窗口发送/接收事件。在您的示例中,您从工作线程绘制,但您已经从主线程创建了窗口-因此它崩溃


如果从工作线程中创建窗口,则应该可以。此外,如果您打算使用事件,请仅从辅助线程执行此操作(有些工具包,例如wxWidgets,具有允许其他线程发送事件的原语,有些则要求您使用队列等来执行管道操作)。

尝试从辅助线程而不是从主线程创建窗口是有意义的!我直接试试。D非常感谢你的帮助。当我在手机上输入我的评论时,贴出了一个真实的答案:)完美的解释:D非常感谢。