2016-10-14 14 views
0

I과 같이 보이는 MATLAB GUI를 가지고 : MATLAB GUI imageMATLAB GUI는 drawnow를 사용하여 일시 정지에도 불구하고 전화를 끊은

내가 달성하기 위해 시도하고 MATLAB은 일시 정지를 제외하고 지속적으로 자정 검사 유지하는 것이있을 때 사용자가 인터페이스를 변경합니다. 따라서 자정인지 계속 확인해야하므로 백그라운드에서 while 루프를 계속 실행하고 있습니다. 그렇다면 몇 가지 기능을 수행합니다. 이 while 루프를 포함하는 함수는 사용자 입력 변경이 감지 된 후에 호출됩니다. 즉, 팝업 메뉴, 누름 단추 식, 텍스트 상자 등의 모든 콜백 함수의 끝에서 호출됩니다.이 때문에 while 루프에 drawnow가있는 이유가 있습니다. 따라서 사용자가 변경하고 일부 계산을 실행하려는 경우 해당 값이 감지됩니다. 계산이 끝나면이 while 루프가있는 함수를 다시 호출합니다.

내 while 루프에서 drawnow 및 pause를 사용하더라도 때때로 MATLAB이 여전히 멈추고 GUI가 응답하지 않아 사용자 입력을 인식하지 못하는 문제가 있습니다.

while 1 
    pause(0.1); 
    drawnow; 
    pause(0.1); 
    current_time=clock; 
    if current_time(4)==0 
     post_mortem; 
    end 
end 

내가 그것을 그러나 지금 내 문제가 아니라고, 심야 시간에 지속적으로 post_mortem 호출로 위의 코드는 효율적이지 알고 : 여기에 내 코드의 while 루프 부분입니다. 내 문제는 예를 들어 정오에도 때때로 내게 끊깁니다. 아무도 이것에 대한 해결책이 있습니까? 이전의 비슷한 질문에 대한 답변을 검색 할 때 솔루션은 drawnow 및 일시 중지를 사용하는 것으로 보였지만 그 방법은 저에게 효과적이지 않은 것으로 보입니다.

모든 안내를 받으실 수 있습니다. MATLAB은 멀티 스레드 다른 기능의 차단의 모든 종류를 일으킬 것입니다 지속적으로 (예 : 시간과 같은) 뭔가를 확인하는 while 루프를 사용하지 않기 때문에

+0

'while'루프 대신 'timer'를 사용해 보셨습니까? 당신은 그런만큼 좋은 성능을 많이 얻는 것과 같아요. – Suever

답변

0

감사드립니다. drawnowpause이 잠재적으로 도움이 될 수 있지만 여전히 잠재적 인 문제가 있습니다.

개체를 사용하면 미리 지정된 간격으로 시간을 확인할 수 있습니다. 이렇게하면 GUI와의 사용자 상호 작용이 자동으로 등록되고 pause 또는 drawnow을 호출하지 않아도 콜백이 실행됩니다.

GUI를 만들 자마자 바로 타이머를 생성하고 시작할 수 있습니다.

% Create the timer object 
handles.mytimer = timer('ExecutionMode', 'FixedRate', ... 
         'Period', 1/5, ... 
         'BusyMode', 'drop', ... 
         'TimerFcn', @(s,e)timerCallback()); 

% Start the timer 
start(handles.mytimer) 

function timerCallback() 
    % Callback that executes every time the timer ticks 

    current_time = clock; 
    if current_time(4) == 0 
     post_mortem; 
    end 
end