我正在使用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字段的更新版本,但我没有。逐步调试显示计时器回调检索的句柄版本对应于opensfunction创建的版本,缺少blip字段。 我已经在这个网站上找到了这个问题的解决方案,并且使用谷歌,但是没有找到解释(或者只使用回调而不是函数的方法) - 有些已经成功完成了功能但是这里的定时器功能是什么阻止了我从写一个常规函数来做同样的事情并从回调中调用它。
答案 0 :(得分:0)
正如评论中的excaza所说:发生这种情况的原因是因为无论计时器周期是什么,都会立即在MATLAB中启动定时器时调用定时器功能,从而在设置之前检查该值。解决方法是在启动计时器之前更改变量,更新guidata然后启动计时器(最终再次更新guidata)。