7

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

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

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

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

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

4

3 回答 3

4

根据这个 MATLAB newsgroup thread,线程似乎无法修改图形对象。只有桌面 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会在线程中工作,但希望您能够根据自己的需要进行调整。

以下是上述代码中使用的 Parallel Computing Toolbox 函数的文档:createJob, createTask, submit, waitForState, destroy.

于 2010-12-10T16:55:34.133 回答
2

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

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

于 2010-12-10T16:23:10.833 回答
-2

您必须解决输入设备中 20 毫秒的延迟问题。如果速度太慢,请换一个输入设备。您可以使用适当的响应框获得良好的亚毫秒级计时。

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

于 2011-02-09T18:39:53.213 回答