Прерывание цикла for в MATLAB GUI - PullRequest
6 голосов
/ 24 декабря 2010

У меня есть цикл for в функции открытия GUI в MATLAB, и я пытаюсь использовать кнопку обратного вызова, чтобы разорвать цикл. Я новичок в MATLAB. Вот код, который у меня есть:

%In the opening function of the GUI
handles.stop_now = 0;
for i=1:inf
   if handles.stop_now==1
      break;
   end
end


% Executes on button press 
function pushbutton_Callback(hObject, eventdata, handles)
% hObject    handle to end_segmenting_button (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
handles.stop_now=1;
guidata(hObject, handles);

По некоторым причинам, несмотря на определение переменных с помощью маркеров, цикл не прерывается при нажатии кнопки. Кто-нибудь знает, что происходит? Спасибо.

Ответы [ 2 ]

8 голосов
/ 24 декабря 2010

Проблема, с которой вы столкнулись, состоит в том, что структура значений, передаваемых в функцию открытия для handles, фиксируется на том, что было при вызове функции открытия.Вы никогда не получите новую структуру, которая обновляется на pushbutton_Callback.Вы можете получить новую структуру, вызвав GUIDATA в вашем цикле.Вот как я бы посоветовал вам попробовать написать цикл:

handles.stop_now = 0;  %# Create stop_now in the handles structure
guidata(hObject,handles);  %# Update the GUI data
while ~(handles.stop_now)
  drawnow;  %# Give the button callback a chance to interrupt the opening function
  handles = guidata(hObject);  %# Get the newest GUI data
end

Большая проблема с дизайном графического интерфейса ...

На основании дополнительного описания в вашем комментарии о том, что вы пытаетесь выполнитьВаш графический интерфейс, я думаю, что может быть лучший способ создать его.Вместо того, чтобы иметь непрерывный цикл для пользователя, чтобы повторно вводить области интереса, которые он затем должен нажимать на кнопку, чтобы остановить, вы можете покончить с циклом и кнопкой остановки и добавить кнопку «Добавить область интереса» в свой графический интерфейс.Таким образом, пользователь может просто нажать кнопку, когда он хочет добавить еще один ROI.Сначала вы можете заменить цикл for в функции открытия следующими инициализациями:

handles.nROIs = 0;  %# Current number of ROIs
handles.H = {};  %# ROI handles
handles.P = {};  %# ROI masks
guidata(hObject,handles);  %# Update the GUI data

Затем вы можете заменить обратный вызов для вашей кнопки чем-то вроде следующего:

function pushbutton_Callback(hObject,eventdata,handles)
%# Callback for "Add new ROI" button
  nROIs = handles.nROIs+1;  %# Increment the number of ROIs
  hROI = imfreehand;  %# Add a new free-hand ROI
  position = wait(hROI);  %# Wait until the user is done with the ROI
  handles.nROIs = nROIs;  %# Update the number of ROIs
  handles.H{nROIs} = hROI;  %# Save the ROI handle
  handles.P{nROIs} = hROI.createMask;  %# Save the ROI mask
  guidata(hObject,handles);  %# Update the GUI data
end
4 голосов
/ 24 декабря 2010

Здесь я вижу две потенциальные проблемы.

Первое: переменная handles не является ссылкой, настройка handles.stop_now=1; теряется после выхода из потока управления pushbutton_Callback.Используйте guidata или другие подходы для хранения и получения данных.

Вторая проблема: Используйте функцию drawnow () .См. эту статью Яир Альтман для хорошего объяснения.

Краткое описание: графика MATLAB - это Java Swing, и операции ввода-вывода (например, нажатие кнопки) выполняются в специальном потоке - потоке диспетчеризации событий (EDT).Вызов drawnow ();очищает очередь событий и обновляет окно рисунка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...