Как я могу распараллелить ввод и отображение в MATLAB? - PullRequest
7 голосов
/ 10 декабря 2010

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 10 декабря 2010

Согласно этой ветке группы новостей MATLAB , кажется, что потоки не могут изменять графические объекты. Только настольный клиент MATLAB может сделать это. Это означает, что вы не можете обрабатывать обновление графики из потока, и я могу подтвердить это, когда попробовал это сделать и не смог изменить рисунки или даже корневой объект из потока.

Тем не менее, я думаю, что вы можете выполнить обновление основной графики в 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

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

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

2 голосов
/ 10 декабря 2010

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

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

0 голосов
/ 09 февраля 2011

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

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

...