Python/Psychopy WindowsError: исключение: чтение прав доступа 0x00000010
Когда я пытаюсь вызвать эту функцию в моей программе, она вызовет ошибку (в заголовке), если я буду долго запускать программу. Кажется, что более 5 минут, потраченные на программу, приведут к ее аварийному завершению.
Windows 8 Python 2.7 Психопатия 1.82.02
def WaitForKeyInput():
timer= core.CountdownTimer(5)
trialClock.reset()
text='...'
#until return pressed, listen for letter keys & add to text string
while event.getKeys(keyList=['return'])==[]:
letterlist=event.getKeys(keyList=['0', '1', '2', '3', '4', '5' , '6', '7', '8', '9','backspace','q'])
color = 'black'
if timer.getTime() >= 3:
color = 'green'
elif timer.getTime() >=0:
color = 'yellow'
elif timer.getTime() <0:
color = 'red'
feedback = visual.Rect(mywin, width= 200,height = 200, pos = (0,-100), lineWidth=5.0, lineColor = color)
betAsk.draw()
feedback.draw()
response = visual.TextStim(mywin, height=36,text=text,color="white",pos=(0,-100))
if text != '...':
response.draw()
mywin.flip()
for l in letterlist:
if l == 'q':
core.quit()
#if key isn't backspace, add key pressed to the string
if l !='backspace':
if text =="...":
text=l
pressedkeys=l
else:
text+=l
pressedkeys+=(";" + l)
#otherwise, take the last letter off the string
elif len(text)>0:
text=text[:-1]
pressedkeys+=(";backspace")
event.clearEvents()
1 ответ
Вам следует ознакомиться с некоторыми из демонстраций PsychoPy, чтобы лучше понять, как использовать их классы. Общая схема такова, что, где это возможно, вы должны просто создать объект (например, feedback = visual.Rect(...)
) только раз. Затем впоследствии просто обновите его свойства по мере необходимости.
Например, в этом случае на каждой итерации цикла вы без необходимости воссоздаете feedback
, Вместо этого создайте его экземпляр только один раз, до начала цикла, а затем просто вызовите feedback.lineColor = colour
обновить только это свойство, а затем feedback.draw()
,
Зачем? Как минимум две причины:
Создание объекта обычно занимает не так много времени по сравнению с простым обновлением свойств уже существующего объекта. В коде, подобном этому, который выполняется при каждом обновлении экрана, создание такого объекта может на самом деле потребовать более одного обновления экрана и, следовательно, разрушить ваше время.
В базовом файле произошла утечка памяти
pyglet
библиотека, которую PsychoPy использует для отображения текста. Это очень вероятно, что создает исключение вашей памяти, из-за того, что вы создаетеresponse
текстовые стимулы в тысячи раз.
Таким образом, решение будет состоять в том, чтобы реструктурировать ваш код, чтобы избежать создания нескольких объектов, как общий принцип, а также чтобы избежать этой раздражающей утечки текстовой памяти, над которой PsychoPy не имеет реального контроля.
Вы также должны избегать event.getKeys()
в вашем while
состояние. Это немедленно сопровождается другим вызовом event.getKeys()
, Это снова очистит очередь нажатий клавиш, что позволит вам часто пропускать нажатия клавиш, которые были бы обнаружены, если бы вы проверяли только один раз в каждом цикле. Также, event.clearEvents()
скорее всего не нужно.