최소한의 실제 예제로 Mathworks에서 제공하는 타이머 GUIDE 콜백 예제에서 작업하고 있습니다. 파일은Matlab GUIDE 콜백은 guidata가 사용될 때에도 핸들을 업데이트하지 않습니다.
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);
는 기본적으로 핸들의 글 필드를 생성. 그런 다음 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'참조). guidata를 사용하여 이전에 호출 된 콜백에서 핸들의 마스터 버전을 업데이트 한 다음 타이머 콜백 (예제의 코드)에서 guidata를 사용하여이 마스터 버전을 검색 할 수 있습니까? 나는 블립 필드가있는 업데이트 된 버전을 가져야하지만 그렇지 않습니다. 디버깅 단계별로 타이머 콜백에 의해 검색된 핸들 버전은 블립 필드가없는 openingfunction에 의해 만들어진 버전과 일치 함을 보여줍니다. 이 사이트의 문제와 Google을 사용하여 해결책을 모색했지만 설명이 없습니다 (또는 함수가 아닌 콜백 만 사용하는 방법) - 일부 기능은 성공했지만 타이머 기능은 다음과 같습니다. 저도 같은 일을하고 콜백에서 호출하는 정규 함수를 작성하지 않았습니다.
타이머는 시작시 즉시 'TimerFcn'을 실행하므로'handles.blip = 1;'이 설정되기 전에 update_display가 실행됩니다. 타이머가 시작되기 전에'handles '을 수정해야합니다. – excaza
맞습니다! 나는 이것을 예상하지 않았고 타이머를 시작하기 전에 guidata를 업데이트하면 문제가 해결되었다. 많은 감사 :). 나는 upvote하지만 나는 더 많은 평판이 필요하다고 믿는다. 나는 대답을 만들어 그것을 받아 들여 다른 사람들이 똑같은 문제를 겪고 있다면 도움이된다. –