Как я могу распараллелизировать вход и отображение в MatLab?

StackOverflow https://stackoverflow.com/questions/4410339

Вопрос

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

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

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

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

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

Это было полезно?

Решение

Согласно с эта группа новостной группы 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 с простой Пауза заявление и возвращаемое значение. Я не уверен, ли KbCheck Будет работать в потоке, но, надеюсь, вы сможете адаптировать это для ваших нужд.

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

Другие советы

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

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

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

Все это разговоры о резьбе пробьжаются и не применимы к Framework PTB.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top