Matlab Psychtoolbox无阻塞限时3秒识别鼠标左右键点击方案咨询
解决方案
Psychtoolbox的GetMouse函数返回的第三个输出buttons是长度为3的逻辑数组,对应按键规则如下:
buttons(1)为1代表鼠标左键被按下buttons(2)为1代表鼠标中键被按下buttons(3)为1代表鼠标右键被按下
你之前只通过any(buttons)判断是否有按键触发,只需要读取数组对应位置的取值即可识别左右键,同时保留非阻塞轮询、3秒超时的逻辑。
修正后完整实现代码
clc clear; SamplingRate=48000; wait4resTime = 3; % 3秒响应窗口期 F=[250 500 1000 2000 4000]; t=linspace(0,1,SamplingRate); trialNum = length(F); % 预分配存储变量,提升运行稳定性 memory = cell(1,trialNum); % 存储各试次音频 resRecord = NaN(1,trialNum); % 存储响应结果:1=左键 2=右键 0=超时 rtRecord = NaN(1,trialNum); % 存储各试次反应时 for ind=1:trialNum Frequency = F(ind); y=sin(t*2*pi*Frequency); tStart=GetSecs; sound(y,SamplingRate); % 注:正式实验建议替换为Psychtoolbox原生PsychPortAudio接口,播放延迟更低、更稳定 gotResponse = 0; % 响应状态标记 while ~gotResponse && (GetSecs - tStart) < wait4resTime [~,~,buttons] = GetMouse(); if buttons(1) % 检测到左键按下 resRecord(ind) = 1; rtRecord(ind) = GetSecs - tStart; gotResponse = 1; elseif buttons(3) % 检测到右键按下 resRecord(ind) = 2; rtRecord(ind) = GetSecs - tStart; gotResponse = 1; end WaitSecs(0.001); % 加1ms延时降低CPU占用,不影响检测精度 end % 标记超时无响应试次 if ~gotResponse resRecord(ind) = 0; end pause(4); % 试次间间隔 memory{ind} = y'; end
改动说明
- 补全了左右键识别逻辑,直接读取
buttons数组对应索引即可区分按键类型 - 预分配了响应结果、反应时存储变量,避免循环动态扩容影响运行性能
- 增加了1ms轮询间隔,大幅降低空转时的CPU占用
- 修正了原代码中未定义
jnd变量的错误
内容的提问来源于stack exchange,提问作者mohadeseh
相关产品推荐
相关产品推荐

