2016-08-11 1 views
0

최소한의 실제 예제로 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을 사용하여 해결책을 모색했지만 설명이 없습니다 (또는 함수가 아닌 콜백 만 사용하는 방법) - 일부 기능은 성공했지만 타이머 기능은 다음과 같습니다. 저도 같은 일을하고 콜백에서 호출하는 정규 함수를 작성하지 않았습니다.

+1

타이머는 시작시 즉시 'TimerFcn'을 실행하므로'handles.blip = 1;'이 설정되기 전에 update_display가 실행됩니다. 타이머가 시작되기 전에'handles '을 수정해야합니다. – excaza

+0

맞습니다! 나는 이것을 예상하지 않았고 타이머를 시작하기 전에 guidata를 업데이트하면 문제가 해결되었다. 많은 감사 :). 나는 upvote하지만 나는 더 많은 평판이 필요하다고 믿는다. 나는 대답을 만들어 그것을 받아 들여 다른 사람들이 똑같은 문제를 겪고 있다면 도움이된다. –

답변

0

의견에서 excaza가 말한 것처럼 : 타이머 기능이 타이머 시간과 관계없이 타이머 기능이 MATLAB에서 시작되는 즉시 호출되므로 타이머 기능이 설정되기 전에 값을 확인하기 때문에 타이머 기능이 즉시 호출되기 때문입니다. 해결 방법은 타이머를 시작하기 전에 변수를 변경하고 guidata를 업데이트 한 다음 타이머를 시작하여 결국 guidata를 다시 업데이트하는 것입니다.

관련 문제