Для того чтобы быть подлинно «асинхронным» нужны потоки, и, как предполагает Джонас, они небезопасны для использования с 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
Jonas также прав, однако, что вы должны использовать номера кадров вместо часового времени, если у вас есть короткие стимулы и забота о том, чтобы они были точно рассчитаны. В качестве наглядного примера в приведенном выше коде я добавил несколько невозможных времен. Например, 0,18 (180 мс), что невозможно при использовании монитора с частотой 60 Гц. В приведенном выше коде 0.18 эффективно округляется до следующего кадра, и стимул будет отображаться в 183 мс (11 кадров в блок).
Остальная часть логики выше (проверка списка запуска/остановки) все равно должна работать одинаково.
Jon