2010-12-10 3 views
7

Я использую Psychtoolbox в MATLAB для запуска парадигмы поведенческой психологии. В рамках парадигмы пользователи должны просматривать визуальный стимул и реагировать на него с использованием некоторого механизма ввода. Для клавиатуры, это работает следующим образом:Как я могу распараллелить ввод и отображение в MATLAB?

  1. показать стимул
  2. опрос клавиатуры для ответа
    1. если не обнаружено никакого ответа, петля обратно на 1
    2. если ответ обнаружен, перерыв и двигаться дальше с помощью сценария

Это прекрасно работает для клавиатуры, а шаг 2 занимает от 1-2 мс. Проблема возникает, когда я использую альтернативный механизм ввода; в этом случае шаг 2 занимает ~ 20 мс. (Мне нужен этот альтернативный вход для запуска исследования, и это следует считать непреложным фактом.) Поскольку стимул изменяется с очень небольшим промежутком времени, эта добавленная задержка нарушает задачу.

Моя текущая мысль - попытаться использовать параллельную обработку, чтобы один поток показывал стимул, а другой поток опроса клавиатуры. В настоящее время я использую Parallel Computing Toolbox. Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как направить ввод с клавиатуры на «параллельный» поток. Кто-нибудь знает (1), можно ли направить ввод с клавиатуры на поток или передать поток визуальный сигнал на монитор, и если да, (2) как это сделать?

Кроме того, если у кого-то есть лучшие идеи относительно того, как подойти к этой проблеме, я все уши.

+0

Я немного смущен. Вы хотите показать один стимул, подождать заданное количество времени для любого ответа от пользователя, а затем показать еще один стимул, в котором они не ответили (или разбить петлю, если они есть)? Кроме того, как именно задержка «ломает» задачу? – gnovice 2010-12-10 17:15:39

+0

@gnovice - Нет, я хочу показать (и постоянно обновлять) один стимул и только прекратить показывать (обновлять) его при ответе. Как разрывается задержка, это довольно подробно, но достаточно сказать, что экран должен обновляться порядка 5-8 мс, а дополнительная задержка в 20 мс слишком велика. – eykanal 2010-12-10 18:20:20

+0

Итак, я думаю, у вас есть анимированный стимул, если вам нужно постоянно обновлять его, но каждые 5-8 мсек будут иметь частоту кадров 125-200 Гц. Неужели это так быстро? Типичная частота кадров 60 Гц обычно достаточно хороша, чтобы избежать мерцания. – gnovice 2010-12-10 18:34:55

ответ

4

Согласно this MATLAB newsgroup thread, кажется, что потоки не могут изменять графические объекты. Это может сделать только клиент MATLAB на рабочем столе. Это означает, что вы не можете обрабатывать обновление графики из потока, и я могу подтвердить это, как я пробовал, и не смог изменить цифры или даже root object из потока.

Однако, я думаю, вы сможете выполнить основное обновление графики в MATLAB, в то время как поток обрабатывает опрос для вашего ввода. Вот пример функции для непрерывного обновления экрана до тех пор поток ожидает ввода от KbCheck не закончил бег:

function varargout = plot_until_input 

    obj = createJob();         %# Create a job 
    task = createTask(obj,@get_input,4,{deviceNumber}); %# Create a task 
    submit(obj);           %# Submit the job 
    waitForState(task,'running'); %# Wait for the task to start running 

    %# Initialize your stimulus display here 
    while ~strcmp(get(task,'State'),'finished') %# Loop while the task is running 
    %# Update your stimulus display here 
    end 

    varargout = get(task,'OutputArguments'); %# Get the outputs from the task 
    destroy(obj);        %# Remove the job from memory 

%#---Nested functions below--- 

    function [keyIsDown,secs,keyCode,deltaSecs] = get_input(deviceNumber) 
    keyIsDown = false; 
    while ~keyIsDown %# Keep looping until a key is pressed 
     [keyIsDown,secs,keyCode,deltaSecs] = KbCheck(deviceNumber); 
    end 
    end 

end 

я смог успешно выполнить вышеуказанную функцию с некоторыми простыми Plotting рутин и заменив код в get_input с простой оператор pause и возвращаемое значение. Я не уверен, будет ли KbCheck работать в потоке, но, надеюсь, вы сможете адаптировать его для своих нужд.

Вот документация для параллельных Toolbox функций Computing, используемых в приведенном выше коде: createJob, createTask, submit, waitForState, destroy.

2

Я не знаю, как вы могли бы это сделать с параллельной обработкой.

Однако, возможно, вы сможете использовать функцию timer object. Вы настроили объект таймера для опроса механизма ввода и, если что-нибудь обнаружено, измените значение глобальной переменной. Затем вы начинаете рутину стимулов. В цикле while, в котором вы обновляете дисплей, вы продолжаете проверять глобальную переменную для изменения с объекта таймера.

-2

Вы должны устранить задержку 20 мс на своем устройстве ввода. Если это слишком медленно, то получите другое устройство ввода. Вы можете получить хорошую субмиллисекундную синхронизацию с соответствующими блоками ответа.

Все эти разговоры о заправке ошибочны и не применимы к каркасу PTB.

Смежные вопросы