Выход из цикла MATLAB в функции при использовании GUI - PullRequest
1 голос
/ 27 марта 2011

У меня есть функция, которая запускается при нажатии кнопки, и эта функция вызывает другую функцию для выполнения черчения, которая представляет собой анимацию, составленную из серии циклов. Проблема в том, что после запуска программы ее нельзя остановить, если не нажать клавиши Ctrl + C, что приведет к сбою всего файла .exe и его повторному открытию.

Я хочу сделать кнопку сброса, чтобы остановить цикл, но как передать новую переменную из прерывания в существующую функцию, которая находится на два уровня выше стека?

Спасибо

edit @ 22:13 27/3/2011 (UKT)

более ясно, что я пытаюсь сделать:

function push_calculate_Callback(hObject, eventdata, handles)
    (List of parameters read in the GUI)
    fmain(list of paramters required to pass to the function, fmain)

это первая часть кода, которая напрямую связана с GUI, fmain выглядит так:

function fmain(List of parameters)
(List of calculations...)
fplotting(list of paramters for plotting)

, в котором fplotting - это то, откуда появляется анимация, внутри fplotting:

function fplotting(list of parameters)
for i = 1:(end)
    (do the animation plot)
end

вот цикл, в котором я хочу остановиться, когда нажимаю кнопку сброса. Потому что если кто-нибудь нажмет Ctrl + C во время анимации (зацикливание), это выдаст ошибку, и exe-файл вылетит и потребует ее повторного открытия. Так что я хочу, чтобы он мог остановить его, когда кто-то нажмет кнопку сброса.

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

Спасибо

Ответы [ 3 ]

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

Лучше всего будет использовать переменную PERSISTENT , состояние которой вы проверяете на каждой итерации цикла в функции 2, и значение которой вы изменяете в обратном вызове "reset".

сбросить обратный вызов

function reset_callback(hObj,eventdata,handles)
   %# "activate" persistent variable
   persistent breakThis
   %# set it to 1
   breakThis = true;

функция с циклом

function functionWithTheLoop(someInput)
   ...
   %# "activate persistent variable
   persistent breakThis
   ...
   %# start loop
   for iter = 1:numOfIterations
      %# check whether you need to break out of the loop
      if breakThis
         %# reset the function value
         breakThis = false;
         break;
      end    
      ...   
   end
0 голосов
/ 28 марта 2011

Вы можете использовать информацию о данных приложения, т.е. setappdata и getappdata:

% animation loop function
function loop(hFig)
   setappdata(hFig, 'run', true);   % here or somewhere else...
   while(getappdata(hFig, 'run'))
      plot(....);
   end
end

% GUI stop-loop btn callback
function stop(hFig)
   setappdata(hFig, 'run', false);
end

Я думаю, это сработает.

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

Используйте выход или выход для выхода из программы

Чтобы остановить цикл, вы можете использовать функцию break или return из функции.

...