多线程会导致程序停止运行。

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()

这很简单,但它却经常突然停止运行!

非常感谢。


尝试从工作线程创建窗口,而不是从主线程创建。 - user948581
是的,这很有道理!我会直接尝试。谢谢。 - The Maestro
它完美地运行了:D 非常感谢您的帮助。 - The Maestro
发布了一个实际的答案,因为我在手机上打字发表了评论 :) - user948581
1个回答

3
一般来说,窗口工具包不喜欢被从不同的线程中使用(这主要是由于底层操作系统的工作方式),PsychoPy也不例外。虽然这并没有总是被记录下来,但通常情况下可以在使用线程时使用它们,只要单个线程(无论是主线程还是工作线程)与窗口进行交互。
与窗口进行“交互”实际上有三件事情:创建窗口、在窗口中绘制和发送/接收窗口事件。在你的示例中,你从工作线程绘制,但是你已经从主线程创建了窗口 - 因此它会崩溃。
如果你从工作线程中创建窗口,那么应该没问题。此外,如果你打算使用事件,请仅从工作线程中使用(一些工具包,例如wxWidgets,具有允许其他线程发送事件的基元,但有些需要你使用例如队列之类的管道)。

非常完美地解释了:D 非常感谢。 - The Maestro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接