Python / Psychopy WindowsError:异常:访问冲突读取0x00000010

时间:2016-03-14 23:14:32

标签: python windows python-2.7 psychopy

当我尝试在程序中调用此函数时,如果我长时间运行程序,它将调用错误(在标题中)。似乎超过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 个答案:

答案 0 :(得分:3)

您应该查看一些PsychoPy演示,以便更好地了解如何使用它的课程。一般方案是在可能的情况下,您应该只创建一个对象(例如feedback = visual.Rect(...))。然后,根据需要更新其属性。

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

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

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

  • PsychoPy用于文本显示的基础pyglet库中存在内存泄漏。由于你创建了response文本刺激数千次,这很可能是创建内存异常的原因。

因此,一个解决方案是重构您的代码以避免多个对象创建,作为一般原则,但也避免这种烦人的文本内存泄漏,而PsychoPy没有真正的控制权。

您还应避免event.getKeys()处于while状态。紧接着又打电话给event.getKeys()。这将再次清除按键队列,如果您在每个循环中仅检查一次,则可能会经常错过本来会检测到的按键。此外,event.clearEvents()可能是不必要的。