如何在MATLAB中并行输入和显示?

eyk*_*nal 7 parallel-processing matlab psychtoolbox

我在MATLAB中使用Psychtoolbox来运行行为心理学范例.作为范例的一部分,用户必须查看视觉刺激并使用某种输入机制对其进行响应.对于键盘,其工作原理如下:

  1. 显示刺激
  2. 轮询键盘以进行响应
    1. 如果未检测到响应,则循环回1
    2. 如果检测到响应,则使用脚本中断并继续

这适用于键盘,因为步骤2需要1-2毫秒.当我使用备用输入机制时会出现问题; 在这种情况下,步骤2需要约20毫秒.(我需要这个替代输入来运行研究,这应该被认为是不可改变的事实.)随着刺激在很短的时间内发生变化,这种增加的延迟打破了任务.

我目前的想法是尝试使用并行处理,这样一个线程显示刺激,另一个线程轮询键盘.我目前正在使用Parallel Computing Toolbox来执行此操作.我遇到的问题是我不知道如何将键盘输入定向到"并行"线程.有没有人知道(1)是否可以将键盘输入定向到线程/让线程向监视器发送视觉信号,如果是,(2)如何做?

此外,如果有人对如何解决这个问题有任何更好的想法,我会全力以赴.

gno*_*ice 4

根据此 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
Run Code Online (Sandbox Code Playgroud)

我能够使用一些简单的绘图例程成功运行上述函数,并get_input用简单的暂停语句和返回值替换代码。我不确定是否KbCheck可以在线程中工作,但希望您能够根据您的需要进行调整。

以下是上述代码中使用的并行计算工具箱函数的文档:createJob, createTask, submit, waitForState, destroy