누구든지 다음에 대한 더 깨끗한 솔루션을 알고 있습니까? 나는 죽일 필요가있을 수도있는 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
그래서, 나는 "종료"버튼을 누르면, 그것은 다시 덤프 홈 화면,하지만 프로세스에서 내 변수를 잃게 ... 종료하는 방법이있다, 또는 "오류"예외를 잡는 사람을 방지 할 수 있습니까?
나쁜 관행이 당신의 작업 흐름의 일환으로 스크립트 또는 기능을 충돌에 의존하는 것 같다. 당신이 무엇을하려고하는지 안다면 왜 코드를 작성하지 않을까요? 조기에 나가기를 원한다면 충돌을 강요하는 대신에? 당신이하려는 일을 할 수있는 방법이 있을지 모르지만이 질문을 볼 때 나는 코드를 구성하는 더 좋은 방법이 있다고 생각하지만 도움이되지 않는다. – Miebster
맞습니다. 음, 저는 그것을 단지 범용 방식으로하고 싶습니다. 물론 위의 코드는 루프에서 검사되는 특정 변수를 설정할 수 있습니다. 그러나 나는 "킬 가능 창"기능이 가능한 경우 발신자 코드의 세부 사항과 독립적 이길 원합니다.대안이 'cntrl-C'를 치고 위보다 잠재적으로 더 나쁜 방법으로 충돌하고 있음을 기억하십시오. –