我在MATLAB中使用Psychtoolbox来运行行为心理学范例。作为范例的一部分,用户必须查看视觉刺激并使用某种输入机制对其进行响应。对于键盘,其工作原理如下:
这适用于键盘,因为步骤2需要1-2毫秒。当我使用备用输入机制时会出现问题;在这种情况下,步骤2需要约20毫秒。 (我需要这个替代输入来运行研究,这应该被认为是不可改变的事实。)随着刺激在很短的时间内发生变化,这种增加的延迟打破了任务。
我目前的想法是尝试使用并行处理,这样一个线程显示刺激,另一个线程轮询键盘。我目前正在使用Parallel Computing Toolbox来做到这一点。我遇到的问题是我不知道如何将键盘输入定向到“并行”线程。有没有人知道(1)是否可以将键盘输入定向到线程/让线程向监视器发送视觉信号,如果是,(2)如何做?
此外,如果有人对如何解决这个问题有任何更好的想法,我会全力以赴。
根据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函数的文档:createJob
,createTask
,submit
,waitForState
,destroy
。
我不知道如何通过并行处理来实现这一点。
但是,您可以使用的功能是timer object。您可以设置计时器对象以轮询输入机制,如果检测到任何内容,则更改全局变量的值。然后,你开始你的刺激程序。在您正在更新显示的while循环中,您将继续检查全局变量以获取计时器对象的更改。
您必须解决输入设备中的20ms延迟问题。如果它太慢则获得另一个输入设备。通过适当的响应框,您可以获得良好的亚毫秒级时序。
所有关于线程的讨论都是错误的,不适用于PTB框架。