2015-11-02 4 views
0

Я ищу функцию для планирования асинхронного вызова функции, например представления изображения через 100 мс, после 200 мс и после 300 мс и маскирования этого изображения при 150 мс 250 мс и 350 мс.Функции расписания, выполняемые в определенное время в психопатии асинхронно

Я уверен, что могу сделать это с задержками, но я бы предпочел сделать это асинхронно. Я смог сделать это в pyepl с time.timedCall.

ответ

0

Я не думаю, что в настоящее время существует какой-либо способ сделать это. Насколько я знаю, предыдущие попытки запустить части представления психотических стимулов отдельных потоков потерпели неудачу. Это что-то вроде OpenGL, не очень надежного для этого.

Если есть способ для демонстрации стимулов асинхронно, остерегайтесь того, что визуальный материал должен быть действительно рассчитан с точки зрения количества кадров, а не миллисекунд в течение длительностей, которые вы рассматриваете. Представление, например, 100 мс едва мог пропустить 6-й кадр, таким образом отобразив изображение на 7-м кадре (после 116,7 мс). Это один из тех моментов, когда, как я думаю, многие другие программные пакеты для презентаций с стимулированием вводят пользователей в заблуждение.

Метод `` `psychopy.visual.Window.flip()` `позволяет синхронизировать использование фреймов.

2

Для того чтобы быть подлинно «асинхронным» нужны потоки, и, как предполагает Джонас, они небезопасны для использования с 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