Matlab, как сделать окно, которое можно убить, чтобы остановить скрипт, когда «ошибка» генерирует исключения, но кто-то их перехватывает - PullRequest
0 голосов
/ 03 марта 2011

Кто-нибудь знает о более чистом решении для следующего: я запускаю сценарий matlab, который в какой-то момент может потребоваться уничтожить. Нажатие на «cntrl-C» работает, но при отладке открывает случайный файл и может все равно завершиться неудачей в зависимости от того, находятся ли фигуры в середине чертежа.

Лучшее, что я мог придумать: добавить кнопку к фигуре, на которую я смотрю, щелчком мыши сделать «очистить все». Простое выполнение «error» не работает, потому что оно выдает исключение, что некоторая функция Matlab успешно перехватывает и продолжает работать.

Обновление / уточнение: принудительный сбой основывается на очистке некоторой глобальной переменной в основном скрипте.

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

Тогда это грязная версия убиваемого окна:

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

итак, если мне не нравится то, что я вижу, я нажимаю кнопку "выйти", и она возвращается на начальный экран, но я теряю переменные в процессе ... есть ли способ выйти, или сделать "ошибку", чтобы никто не смог перехватить исключения?

1 Ответ

0 голосов
/ 03 марта 2011

Возможно, следующее поможет вам организовать ваш код в приложении GUIDE. Я использовал данные приложения (см. appdata документы здесь или общие документы здесь ), чтобы создать флаг выполнения runflag . После нажатия кнопки запуска основной цикл вводится в функцию обратного вызова кнопки. Цикл завершается, когда нажимается кнопка «Стоп», настройка, которая устанавливает флаг в данных приложения фигур на ЛОЖЬ.

Вот шаги, которые я использовал, чтобы настроить это.

  1. Начните с создания нового приложения GUIDE,
  2. добавить две кнопки (Пуск и Стоп) и
  3. определить следующие обратные вызовы

Функция обратного вызова открытия

%# --- 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);

Пуск кнопки обратного вызова

%# --- 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)
...