2011-03-03 5 views
0

누구든지 다음에 대한 더 깨끗한 솔루션을 알고 있습니까? 나는 죽일 필요가있을 수도있는 matlab 스크립트를 실행 중입니다. 어떤 시점에서. "cntrl-C"를 치면 작동하지만 디버그에서 임의의 파일을 열어서 그림이 그림의 중간에 있는지에 따라 여전히 실패 할 수 있습니다.matlab, '오류'예외를 throw하지만 누군가가 그들을 잡을 때 스크립트를 중지하려면 깨끗하게 살 수있는 창을 만드는 방법

나는 그림을 볼 수있는 버튼을 추가한다. 마우스를 클릭 할 때 "모두 지우기"를 클릭한다. 일부 "matlab"함수가 성공적으로 catch되어 실행을 계속한다는 예외를 throw하기 때문에 단순히 "error"를 수행하는 것은 효과가 없습니다.

업데이트/설명 : 강제 종료는 기본 스크립트의 일부 전역 변수를 지우는 데 의존합니다.

function myScript() 
global foo; 
foo = 1; 
while 1 

x = DoStuff(); 
sh = figure(1); 
if k == 1 
    killable_window(sh); 
end 
x.display(); 
drawnow; 
y = foo + 1; % <-- crashes if the callback does 'clear all', which kills global variable foo 
end 


end 

다음이는 killable 윈도우의 더러운 버전입니다 : 내가 무엇을보고 마음에 들지 않는 경우

function [] = killable_window(sh) 
    S.fh = sh; 
    S.pb = uicontrol('style','push',... 
       'units','pix',... 
       'position',[10 30 80 20],... 
       'fontsize',12,... 
       'string','Quit');   

set(S.pb,'callback' ,{@pb_call,S}) 
% Check if 'p' is pressed when focus on button and exec callback 
set(S.pb,'KeyPressFcn',{@pb_kpf ,S}); 

% Check if 'p' is pressed when focus on figure and exec callback 
set(S.fh,'KeyPressFcn',{@pb_kpf ,S}); 

% Callback for pushbutton, clears all variables 
function pb_call(varargin) 
    S = varargin{3}; % Get the structure. 

    fprintf('force quitting due to button press...\n'); 

    % ghetto: clear everything to force a crash later 
    % and prevent anyone from successfully catching an exception 
    clear all; 
end 

% Do same action as button when pressed 'p' 
function pb_kpf(varargin) 
    if varargin{1,2}.Character == 'p' 
     pb_call(varargin{:}) 
    end 
end 
end 

그래서, 나는 "종료"버튼을 누르면, 그것은 다시 덤프 홈 화면,하지만 프로세스에서 내 변수를 잃게 ... 종료하는 방법이있다, 또는 "오류"예외를 잡는 사람을 방지 할 수 있습니까?

+2

나쁜 관행이 당신의 작업 흐름의 일환으로 스크립트 또는 기능을 충돌에 의존하는 것 같다. 당신이 무엇을하려고하는지 안다면 왜 코드를 작성하지 않을까요? 조기에 나가기를 원한다면 충돌을 강요하는 대신에? 당신이하려는 일을 할 수있는 방법이 있을지 모르지만이 질문을 볼 때 나는 코드를 구성하는 더 좋은 방법이 있다고 생각하지만 도움이되지 않는다. – Miebster

+0

맞습니다. 음, 저는 그것을 단지 범용 방식으로하고 싶습니다. 물론 위의 코드는 루프에서 검사되는 특정 변수를 설정할 수 있습니다. 그러나 나는 "킬 가능 창"기능이 가능한 경우 발신자 코드의 세부 사항과 독립적 이길 원합니다.대안이 'cntrl-C'를 치고 위보다 잠재적으로 더 나쁜 방법으로 충돌하고 있음을 기억하십시오. –

답변

0

아마도 다음 코드는 GUIDE 응용 프로그램 내에서 코드를 구성하는 데 도움이 될 수 있습니다. 응용 프로그램 데이터 (appdata docs here 또는 일반 문서 here 참조)를 사용하여 실행 플래그 실행 플래그을 생성했습니다. 시작 버튼을 누르면 버튼의 콜백 내에 기본 루프가 입력됩니다. 중지 버튼을 누르면 루프가 종료되고 그림 응용 프로그램 데이터의 플래그가 FALSE로 설정됩니다.

다음은이를 설정하는 단계입니다.

  • 은 다음 콜백을
  • 열기 기능 콜백

    %# --- Executes just before testStop is made visible. 
    function testStop_OpeningFcn(hObject, eventdata, handles, varargin) 
    
    %# Choose default command line output 
    handles.output = hObject; 
    
    %# Add a global variable as a MATLAB application data 
    %# see sharing application data documentation in the MATLAB 
    %# docs 
    %# APPDATA documentation: 
    %# http://www.mathworks.com/help/techdoc/creating_guis/f13-998352.html#f13-999565 
    %# General doc on sharing application data 
    %# http://www.mathworks.com/help/techdoc/creating_guis/f13-998449.html 
    %# 
    setappdata(handles.figure1,'runFlag',true); 
    
    %# Update handles structure 
    guidata(hObject, handles); 
    
    를 정의하는 두 개의 버튼 (시작 및 중지) 및
  • 를 추가 새로운 가이드 응용 프로그램을 작성하여

    1. 시작,

      시작 단추 콜백

      %# --- Executes on button press in btnGo. 
      function btnGo_Callback(hObject, eventdata, handles) 
      i=0; 
      
      %# This loop will stop when the stop button is pressed 
      %# setting the application data _runFlag_ to false 
      while getappdata(handles.figure1,'runFlag') 
          i=i+1; 
          %# Work you want to inturrupt can go here. 
          pause(.1) 
      end 
      

      정지 버튼 콜백은

      %# --- Executes on button press in btnStop. 
      function btnStop_Callback(hObject, eventdata, handles)    
      setappdata(handles.figure1,'runFlag',false) 
      
  • +0

    흥미 롭다면, 나는 여기에 함수 포인터를 스크립트에 전달하고 "% # 당신이 쇄파하고 싶은 작업"을 실행할 수 있다고 생각합니다. 블록 ... –

    +0

    @peter : 나는 그것이 작동 할 수 있다고 확신한다. 또는 stop 버튼에 전역 변수의 값을 설정할 수 있고, 중단시키려는 모든 루프는 각 인터 럽션에서 전역 변수를 검사 할 수있다. 어쨌든 기본 아이디어를 얻은 것처럼 보입니다. – Azim