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() скорее всего не нужно.

Другие вопросы по тегам