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

问题描述 投票:7回答:3

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

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

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

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

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

matlab parallel-processing psychtoolbox
3个回答
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

我能够通过一些简单的绘图程序成功运行上述函数,并用简单的get_input语句和返回值替换pause中的代码。我不确定KbCheck是否会在一个线程中工作,但希望你能够根据自己的需要调整它。

以下是上述代码中使用的Parallel Computing Toolbox函数的文档:createJobcreateTasksubmitwaitForStatedestroy


2
投票

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

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


-2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.