线程停止应用程序
Threading stops the application
我正在使用 OpenCV 开发一个动物追踪程序。当识别出动物时,我想画一些形状并将它们投射在它面前一定的秒数。
为了绘制形状并投影它们,我使用 PsychoPy
当我获取动物并使用 PsychoPy 调用绘制函数时,程序冻结,直到形状消失。我使用线程来解决这个问题,但程序完全停止并显示一条系统消息 "Python quit unexpectedly."
这是我打开话题的方式:
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()
很简单,但一直意外停止!
非常感谢。
一般来说,windowing 工具包不喜欢被不同的线程使用(这主要是由于 underyling OS 的工作方式),PsychoPy 也不例外。它并不总是记录在案,但通常可以将它们与线程一起使用,前提是单个线程(无论是主线程还是工作线程)与 window.
交互
"Interacting" 与 window 本质上是三件事:创建它、绘制它和 sending/receiving 事件 to/from 它。在您的示例中,您从工作线程中绘制,但是您已经从主线程创建了 window - 因此它崩溃了。
如果您从工作线程中创建 window,应该没问题。此外,如果您打算使用事件,请仅从 worker 执行此操作(某些工具包,例如 wxWidgets,具有允许其他线程发送事件的原语,有些则需要您使用例如队列进行管道连接)。
我正在使用 OpenCV 开发一个动物追踪程序。当识别出动物时,我想画一些形状并将它们投射在它面前一定的秒数。 为了绘制形状并投影它们,我使用 PsychoPy
当我获取动物并使用 PsychoPy 调用绘制函数时,程序冻结,直到形状消失。我使用线程来解决这个问题,但程序完全停止并显示一条系统消息 "Python quit unexpectedly."
这是我打开话题的方式:
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()
很简单,但一直意外停止!
非常感谢。
一般来说,windowing 工具包不喜欢被不同的线程使用(这主要是由于 underyling OS 的工作方式),PsychoPy 也不例外。它并不总是记录在案,但通常可以将它们与线程一起使用,前提是单个线程(无论是主线程还是工作线程)与 window.
交互"Interacting" 与 window 本质上是三件事:创建它、绘制它和 sending/receiving 事件 to/from 它。在您的示例中,您从工作线程中绘制,但是您已经从主线程创建了 window - 因此它崩溃了。
如果您从工作线程中创建 window,应该没问题。此外,如果您打算使用事件,请仅从 worker 执行此操作(某些工具包,例如 wxWidgets,具有允许其他线程发送事件的原语,有些则需要您使用例如队列进行管道连接)。