может быть это поможет:
имеет кнопку «стоп», в своем обратном вызове установите флаг в значение true.
в меньшем цикле (то есть другом обратном вызове, который занят циклом), он будет проверять этот флаг в верхней (или нижней) части своего (маленького) цикла.
Если флаг установлен в true, он сразу становится ложным и завершает весь цикл и возвращает. (добавьте проверку в свой цикл, чтобы проверить, установлен ли этот флаг)
Таким образом, максимум, что пользователь должен ждать после нажатия кнопки STOP, - это выполнить одну меньшую итерацию, если попадание произошло сразу после последней проверки.
обратные вызовы прерывают друг друга, поэтому вышеприведенное работает.
Флаг устанавливается в буфере userData и каждый раз читается оттуда другим обратным вызовом.
Этот фрагмент кода из одного моего примера
пример малого цикла
function status= output(t,x,~,data)
%called by ode45 after each step. Plot the current
%pendulum position for simulation
userData = get(data.handles.figure1, 'UserData');
if userData.stop
status=true;
g_status =true;
else
status = false;
.... do real work
end
end
обратный вызов кнопки «Выполнить»
% --- Executes on button press in run_btn.
function run_btn_Callback(hObject, eventdata, handles)
% hObject handle to run_btn (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[data,status] = parse_input(handles);
if not(status)
return;
end
.....
userData.stop = false;
set(handles.figure1, 'UserData',userData);
...
обратный вызов кнопки остановки
% --- Executes on button press in reset_tag.
function reset_tag_Callback(hObject, eventdata, handles)
% hObject handle to reset_tag (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
data = get(handles.figure1, 'UserData');
data.stop = true;
set(handles.figure1, 'UserData',data);
.....