2013-04-14 1 views
0

파일 나는 GUI라는 이름의 SCADA를 만들고 난이를 눌러 GUI가 읽기 GUI 데이터

handles.StatusData=false; 
guidata(handles.output,handles); 

를 시작할 때 즉 false로 설정되어있는 플래그가 StatusData라는 부울 변수를 추가 버튼을 누른 다음 계속 실행되는 함수가 호출됩니다 (이 함수에는 무한 루프가 있음). 잠시 후 StatusData를 true로 설정하는 다른 버튼을 누릅니다.

handles.StatusData=true; 
guidata(handles.output,handles); 

이제 제가 그 함수를 호출 할 때 I 매개 변수로 핸들을 전송이 acheieve하기 위해, 콜백 함수 (동일한 함수 I 위에서 언급)에서 StatusData 액세스 할 필요가있다. 이제 StatusData를 변경하는 버튼을 누르면 실제 핸들의 데이터가 변경되지만 함수가 이미 호출되었으므로 업데이트 된 StatusData에 액세스 할 수 없습니다.

업데이트 된 GUI 핸들을 매개 변수로 보내지 않고 어떻게 액세스 할 수 있습니까?

감사

+0

설명이 약간 혼란 스럽습니다. MATLAB GUIDE에서 GUI를 디자인 할 때 모든 콜백 함수는'handles' 구조체를받습니다. 당신은 그것으로부터 값을 검색 할 수있을뿐만 아니라 값을 설정할 수있다 ('handles'는 참조 객체가 아닌 by-value를 전달하기 때문에'guidata'를 호출하여 그것을 갱신해야 함) – Amro

답변

0

당신은 단지 대신 함수에 hObject 매개 변수를 전달하고,이 guidata를 사용하여 필요한 때 값을 검색 할 수 있습니다; 즉

function some_callback(hObject, handles, ...) 
    myLoopingFunction(hObject, ...); 

function myLoopingFunction(hObject, ...) 
    for someVar = something 
     % Update handles structure 
     handles = guidata(hObject); 
    end 

또는 핸들 개체를 만들어서 처리 구조에 넣을 수 있습니다. 예 :

% In a separate file: 
classdef uiState < handle 
    % Probably should give this class a less general name... 
    properties 
     StatusData 
    end 
end 

% In your UI file: 
function some_callback(hObject, handles, ...) 
    handles.state = uiState(); 
    handles.state.StatusData = false; 
    % Now, when you modify handles.StatusData, the version used by 
    % myLoopingFunction will also be updated, because they point to 
    % the same object! 
    myLoopingFunction(handles.state); 

function myLoopingFunction(state, ...) 
    for someVar = something 
     % Now you just have to check state.StatusData 
    end 

간단한 경우, 첫 번째 방법을 사용합니다. 더 복잡한 상황에서 여러 매개 변수가 추적되고 복잡한 방식으로 상호 작용해야하는 경우 두 번째 매개 변수를 사용합니다. 두 번째 방법은 일부 변수에 많은 양의 데이터가 있고 UI에 대한 모든 호출에 데이터가 복사되지 않도록하려는 경우에도 유용합니다.

개인적으로 복잡한 UI의 경우 사용자 인터페이스를 추적하고 (명령 줄 인터페이스를 제공하는) 일부 응용 프로그램 클래스를 만들어 항상 내 UI에서 사용할 수 있는지 확인해야하지만 이 단순한 경우에 슬레지 해머를 사용하여 잼 항아리를 여는 것과 같습니다.