python - 线程停止应用程序

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

它很简单,但它一直意外停止!

非常感谢。

最佳答案

一般来说,窗口工具包不喜欢被不同的线程使用(这主要是由于底层操作系统的工作方式),PsychoPy 也不异常(exception)。它并不总是记录在案,但通常可以将它们与线程一起使用,前提是单个线程(无论是主线程还是工作线程)与窗口交互。

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

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

关于python - 线程停止应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36494365/

相关文章:

java - 在 Java 6 中,为什么即使低优先级线程让步,高优先级线程也不会运行?

performance - 使用 UMAT 的 OpenCV 3.X 定时函数调用

c++ - Linux : How to detect a process that consumes the maximum memory and kill it?

opencv - 旋转人脸检测

c++ - 使用 OpenCV 和 C++ 进行激光检测

python - 将加载的图像数组保存为 csv

python - 如何更好地使用 Polars 中的 apply?

python - 如何在没有元类冲突的情况下将泛型类型与 PyQt 子类一起使用?

python - 如何验证字符串是否仅包含字母、数字、下划线和破折号?

Ruby 1.9.3 多线程实现比单威胁实现花费更长的时间,为什么?