【问题标题】:Python/Psychopy WindowsError: exception: access violation reading 0x00000010Python/Psychopy WindowsError:异常:访问冲突读取 0x00000010
【发布时间】:2023-03-14 07:27:01
【问题描述】:

当我尝试在我的程序中调用此函数时,如果我运行程序需要很长时间,它将调用错误(在标题中)。在程序上花费超过 5 分钟似乎会导致它崩溃。

Windows 8 蟒蛇 2.7 Psychopy 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()

【问题讨论】:

    标签: python windows python-2.7 psychopy


    【解决方案1】:

    您应该查看一些 PsychoPy 演示,以进一步了解如何使用它的类。一般的方案是尽可能只创建一个对象(例如feedback = visual.Rect(...))一次。随后,只需根据需要更新其属性即可。

    例如,在这种情况下,在循环的每次迭代中,您都在不必要地重新创建 feedback。相反,只需在循环开始之前将其实例化一次,然后只需调用 feedback.lineColor = colour 来更新该属性,然后再调用 feedback.draw()。

    为什么?至少有两个原因:

    • 与仅更新现有对象的属性相比,创建对象通常需要相当长的时间。在这样的代码中,每次屏幕刷新都会运行,这样的对象创建实际上可能需要多次刷新屏幕,从而破坏你的时间。

    • PsychoPy 用于文本显示的底层pyglet 库中存在内存泄漏。这很可能是造成内存异常的原因,因为您创建了数千次 response 文本刺激。

    因此,作为一般原则,一个解决方案是重组代码以避免创建多个对象,同时也避免这种烦人的文本内存泄漏,PsychoPy 无法真正控制它。

    您还应该避免在您的while 条件中使用event.getKeys()。紧随其后的是另一个对event.getKeys() 的调用。这将再次清除按键队列,使您可能经常错过如果您只在每个循环上检查一次就可以检测到的按键。此外,event.clearEvents() 可能是不必要的。

    【讨论】:

    • 谢谢迈克尔!我会看看那些东西。非常感谢您的帮助。
    猜你喜欢
    • 2015-11-19
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多