调度函数以异步方式在心理上的特定时间执行

时间:2015-11-02 03:03:05

标签: psychopy

我正在寻找一种异步调度函数调用的函数,例如在100ms之后,200ms之后和300ms之后呈现图像并在150ms 250ms和350ms处屏蔽该图像。

我确信我可以通过延迟来做到这一点,但我宁愿异步这样做。我能够在pyepl中使用timing.timedCall。

2 个答案:

答案 0 :(得分:2)

真正的' aysnchronous'需要线程,正如Jonas所说,这些与OpenGL一起使用是不安全的(你的显卡不知道命令来自哪个线程,以及它的命令是否由于两个交错而无序执行线程然后结果是不可预测的,可能导致崩溃)。

我自然会用

这样的函数来处理这个问题
def checkTimes(t, listOfPermissible):
    for start,stop in listofPermissible:
       if start < t < stop:
           return True #we found a valid window
    return False #if we got here there was no valid window

然后在我的剧本中我有:

targetTimes = [[0.1, 0.15], [0.2, 0.25]]
maskTimes = [[0.18, 0.2], [0.28, 0.3]]

while continueTrial:
    t = trialClock.getTime()
    #check if we need target
    if checkTimes(t, targetTimes):
        target.draw()

    #check if we need mask
    if checkTimes(t, maskTimes):
        mask.draw()

    #drawing complete so flip the window
    win.flip()

    #check for response
    keys = event.getKeys()
    if keys:
        continueTrial = False

乔纳斯也是对的,但是如果你有短暂的刺激并且关心它们被精确计时,你应该使用帧数而不是时钟时间。作为上面代码中的一个厚颜无耻的例子,我添加了一些不可能的时间。例如0.18(180ms),60Hz监视器是不可能的。在上面的代码中,0.18将有效地向上舍入到下一帧,并且刺激将出现在183ms(块中的11帧)。

上面的其余逻辑(检查开始/停止列表)应该仍然可以正常工作。

乔恩

答案 1 :(得分:0)

我不认为目前有任何办法可以做到这一点。据我所知,以前尝试运行部分心理刺激呈现单独的线程失败了。关于OpenGL的一些东西并没有真正强大。

如果有一种方法可以异步显示刺激,请注意视觉材料应该在帧数方面实际定时,而不是在您考虑的持续时间内以毫秒为单位。在例如100毫秒可能几乎没有错过第6帧,因此在第7帧(116.7毫秒后)显示图像。这是我认为许多其他刺激演示软件包误导用户的一点。

```psychopy.visual.Window.flip()``方法允许使用帧进行计时。