运行 Psychopy window 来自线程段错误
Running Psychopy window from a thread segfaults
我正在尝试从一个单独的线程 运行 我的 Psychopy window 并控制另一个线程上显示的内容,但我得到的只是致命的 Python 错误。
这是一个小示例脚本,它产生的结果与我的大脚本相同
from threading import Thread
from psychopy import visual, core
import time
class ThreadTest(Thread):
def __init__(self):
Thread.__init__(self)
self.text='Test'
self.running = 1
self.start()
print 'doing stuff'
def run(self):
win = visual.Window()
msg = visual.TextStim(win, text=self.text)
while self.running:
msg.setText(self.text)
msg.draw()
win.flip()
print 'Drawing...'
core.wait(2)
win.close()
print 'Stopping thread'
def setText(self, text):
self.text=text
def stopTest(self):
self.running = 0
def main():
tt = ThreadTest()
time.sleep(3)
tt.setText('Test2')
time.sleep(3)
tt.stopTest()
print 'Stopping main thread'
if __name__ == '__main__':
main()
和输出
python testy.py
doing stuff
Fatal Python error: (pygame parachute) Segmentation Fault
Aborted (core dumped)
这会创建 Psychopy window 但无法在其上显示任何文本,然后就崩溃了。我也试过在 __init__()
中创建 window 但这也没有用。
这似乎是文本对象的问题,它来自 pyglet,可能会干扰 pyglet 线程。下面的代码确实有效(令我惊讶的是)!
但是你正在做一些强烈反对和不支持的事情。 OpenGL 调用(处理所有渲染)不是线程安全的,不应从主线程以外的任何地方调用。
基本上,您在这里只能靠自己了! ;-)
from threading import Thread
from psychopy import visual, core
import time
class ThreadTest(Thread):
def __init__(self):
Thread.__init__(self)
self.ori=0
self.running = 1
print 'initialised'
def run(self):
win = visual.Window()
print 'created window'
stim = visual.PatchStim(win)
print 'created stim'
while self.running:
stim.ori = self.ori
stim.draw()
win.flip()
print '.',
core.wait(0.01)
print 'Stopping auxil thread'
def setOri(self, ori):
self.ori=ori
def stopTest(self):
self.running = 0
def main():
tt = ThreadTest()
tt.start()
for frameN in range(180):
tt.setOri(frameN)
time.sleep(0.01)
tt.stopTest()
print 'Stopping main thread'
if __name__ == '__main__':
main()
罪魁祸首确实是不在主循环中的 TextStim。当我交换 main 和 drawloops 时,它开始工作。现在我只需要找到一种方法来停止新线程,即使它正在做某事。
from threading import Thread
from psychopy import visual, core
import time
class ThreadTest(Thread):
def __init__(self):
Thread.__init__(self)
self.text='Test'
self.running = 1
print 'doing stuff'
def run(self):
time.sleep(3)
self.setText('Test2')
time.sleep(3)
self.stopTest()
def mainloop(self):
win = visual.Window()
while self.running:
msg = visual.TextStim(win)
msg.setText(self.text)
msg.draw()
win.flip()
print 'Drawing...'
core.wait(2)
win.close()
print 'Stopping thread'
def setText(self, text):
self.text=text
def stopTest(self):
self.running = 0
def main():
tt = ThreadTest()
tt.start()
tt.mainloop()
print 'Stopping main thread'
if __name__ == '__main__':
main()
我正在尝试从一个单独的线程 运行 我的 Psychopy window 并控制另一个线程上显示的内容,但我得到的只是致命的 Python 错误。
这是一个小示例脚本,它产生的结果与我的大脚本相同
from threading import Thread
from psychopy import visual, core
import time
class ThreadTest(Thread):
def __init__(self):
Thread.__init__(self)
self.text='Test'
self.running = 1
self.start()
print 'doing stuff'
def run(self):
win = visual.Window()
msg = visual.TextStim(win, text=self.text)
while self.running:
msg.setText(self.text)
msg.draw()
win.flip()
print 'Drawing...'
core.wait(2)
win.close()
print 'Stopping thread'
def setText(self, text):
self.text=text
def stopTest(self):
self.running = 0
def main():
tt = ThreadTest()
time.sleep(3)
tt.setText('Test2')
time.sleep(3)
tt.stopTest()
print 'Stopping main thread'
if __name__ == '__main__':
main()
和输出
python testy.py
doing stuff
Fatal Python error: (pygame parachute) Segmentation Fault
Aborted (core dumped)
这会创建 Psychopy window 但无法在其上显示任何文本,然后就崩溃了。我也试过在 __init__()
中创建 window 但这也没有用。
这似乎是文本对象的问题,它来自 pyglet,可能会干扰 pyglet 线程。下面的代码确实有效(令我惊讶的是)!
但是你正在做一些强烈反对和不支持的事情。 OpenGL 调用(处理所有渲染)不是线程安全的,不应从主线程以外的任何地方调用。
基本上,您在这里只能靠自己了! ;-)
from threading import Thread
from psychopy import visual, core
import time
class ThreadTest(Thread):
def __init__(self):
Thread.__init__(self)
self.ori=0
self.running = 1
print 'initialised'
def run(self):
win = visual.Window()
print 'created window'
stim = visual.PatchStim(win)
print 'created stim'
while self.running:
stim.ori = self.ori
stim.draw()
win.flip()
print '.',
core.wait(0.01)
print 'Stopping auxil thread'
def setOri(self, ori):
self.ori=ori
def stopTest(self):
self.running = 0
def main():
tt = ThreadTest()
tt.start()
for frameN in range(180):
tt.setOri(frameN)
time.sleep(0.01)
tt.stopTest()
print 'Stopping main thread'
if __name__ == '__main__':
main()
罪魁祸首确实是不在主循环中的 TextStim。当我交换 main 和 drawloops 时,它开始工作。现在我只需要找到一种方法来停止新线程,即使它正在做某事。
from threading import Thread
from psychopy import visual, core
import time
class ThreadTest(Thread):
def __init__(self):
Thread.__init__(self)
self.text='Test'
self.running = 1
print 'doing stuff'
def run(self):
time.sleep(3)
self.setText('Test2')
time.sleep(3)
self.stopTest()
def mainloop(self):
win = visual.Window()
while self.running:
msg = visual.TextStim(win)
msg.setText(self.text)
msg.draw()
win.flip()
print 'Drawing...'
core.wait(2)
win.close()
print 'Stopping thread'
def setText(self, text):
self.text=text
def stopTest(self):
self.running = 0
def main():
tt = ThreadTest()
tt.start()
tt.mainloop()
print 'Stopping main thread'
if __name__ == '__main__':
main()