【发布时间】:2016-08-11 14:58:25
【问题描述】:
我正在使用 Mathworks 提供的计时器 GUIDE 回调示例作为最小工作示例。可以通过以下方式获取文件:
copyfile(fullfile(docroot, 'techdoc','creating_guis','examples',...
'ex_guide_timergui*.*')), fileattrib('ex_guide_timergui*.*', '+w')
在 Matlab 中。 我像这样修改了示例文件:
function startbtn_Callback(hObject, eventdata, handles)
% hObject handle to startbtn (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% START USER CODE
% Only start timer if it is not running
if strcmp(get(handles.timer, 'Running'), 'off')
start(handles.timer);
end
handles.blip = 1;
guidata(hObject,handles);
在示例中单击开始按钮(并启动计时器)时,基本上是在句柄中创建 blip 字段。然后我使用 giudata 更新句柄的主版本......或者我是这么想的。
我修改了定时器回调函数来测试这个字段:
function update_display(hObject,eventdata,hfigure)
% Timer timer1 callback, called each time timer iterates.
% Gets surface Z data, adds noise, and writes it back to surface object.
handles = guidata(hfigure);
Z = get(handles.surf,'ZData');
Z = Z + 0.1*randn(size(Z));
set(handles.surf,'ZData',Z);
if handles.blip ==1
a = 0;
end
但是,只要我运行 GUI 并启动计时器,MATLAB 就会抛出一个错误,指出 blip 不作为句柄中的字段存在(引用不存在的字段“blip”)。当我在先前调用的回调中使用 guidata 更新句柄的主版本,然后在计时器回调中使用 guidata 检索此主版本(示例中的代码)时,怎么会这样?我应该有带有 blip 字段的更新版本,但我没有。一步步调试显示,timer回调获取的handles版本对应openingfunction生成的版本,缺少blip字段。 我已经在此站点上并使用 google 寻找解决此问题的方法,但没有找到解释(或仅使用回调而不是函数来执行此操作的方法) - 有些函数已经成功,但这里的计时器功能阻止了我从编写一个常规函数来做同样的事情并从回调中调用它。
【问题讨论】:
-
定时器在启动时立即执行它们的
TimerFcn,所以update_display在handles.blip = 1;设置之前被执行。您对handles的修改需要在计时器启动之前进行。 -
没错!我没想到会这样,在启动计时器之前更新 guidata 已经解决了这个问题。非常感谢 :)。我会投票,但我相信我需要更多的声誉......我会创建一个答案并接受它,以便其他人在遇到同样问题时也能从中受益。
标签: matlab timer callback matlab-guide