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

时间:2010-12-10 15:24:09

标签: matlab parallel-processing psychtoolbox

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

  1. 显示刺激
  2. 轮询键盘以进行响应
    1. 如果未检测到响应,则循环回1
    2. 如果检测到响应,则使用脚本打破并继续
  3. 这适用于键盘,因为步骤2需要1-2毫秒。当我使用备用输入机制时会出现问题;在这种情况下,步骤2需要约20毫秒。 (我需要这个替代输入来运行研究,这应该被认为是不可改变的事实。)随着刺激在很短的时间内发生变化,这种增加的延迟会破坏任务。

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

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

3 个答案:

答案 0 :(得分: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

我能够使用一些简单的绘图例程成功运行上述函数,并使用简单的pause语句和返回值替换get_input中的代码。我不确定KbCheck是否适用于某个帖子,但希望您能够根据自己的需要进行调整。

以下是上述代码中使用的并行计算工具箱函数的文档:createJobcreateTasksubmitwaitForStatedestroy

答案 1 :(得分:2)

我不知道如何通过并行处理来实现这一目标。

但是,您可以使用的功能是timer object。您可以设置计时器对象以轮询输入机制,如果检测到任何内容,则更改全局变量的值。然后,你开始你的刺激程序。在您正在更新显示的while循环中,您将继续检查全局变量以获取计时器对象的更改。

答案 2 :(得分:-2)

您必须解决输入设备中的20ms延迟问题。如果它太慢则获得另一个输入设备。通过适当的响应框,您可以获得良好的亚毫秒级时序。

所有关于线程的讨论都是错误的,不适用于PTB框架。