La rupture de boucle for dans MATLAB GUI
J'ai un for
boucle dans la fonction d'ouverture d'une interface graphique sous MATLAB et je suis en train d'utiliser une fonction de rappel bouton pour interrompre la boucle. Je suis nouveau sur MATLAB. Voici le code que j'ai:
%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);
Pour une raison quelconque, en dépit de définir les variables avec des poignées, la boucle n'a pas de pause en appuyant sur le bouton. Quelqu'un sait ce qui se passe? Merci.
Vous devez vous connecter pour publier un commentaire.
Le problème que vous rencontrez est que la structure des valeurs passées à la fonction d'ouverture pour
handles
est fixé à ce qu'il était lors de l'ouverture de la fonction a été appelée. Vous n'avez jamais récupérer la nouvelle structure qui est mise à jour parpushbutton_Callback
. Vous pouvez récupérer la nouvelle structure en appelant GUIDATA dans votre boucle. Voici comment je vous suggère d'essayer la rédaction de votre boucle:Le plus gros problème de conception de la GUI...
Basée sur la description supplémentaire dans votre commentaire au sujet de ce que vous essayez d'accomplir avec votre interface utilisateur graphique, je pense qu'il y a peut-être une meilleure façon de le concevoir. Au lieu d'avoir une boucle continue pour l'utilisateur à entrer plusieurs fois les ROIs, puis appuyez sur un bouton pour l'arrêter, vous pouvez en finir avec la boucle et le bouton d'arrêt et d'ajouter "Ajouter un ROI" bouton de votre interface graphique. De cette façon, l'utilisateur peut simplement appuyer sur un bouton quand ils veulent ajouter un autre ROI. Vous pouvez tout d'abord remplacer la boucle for dans la fonction d'ouverture avec la suite de l'initialisation:
Ensuite, vous pouvez remplacer la fonction de rappel pour votre bouton avec quelque chose comme ce qui suit:
break
sort de la boucle et le contrôle de flux va àimfreehand()
. Par conséquent, vous devez utiliserreturn
au lieu debreak
.Je vois deux problèmes potentiels ici.
Première: variable
handles
n'est pas une référence, réglagehandles.stop_now=1;
va "perdu" après le contrôle de flux de sortiespushbutton_Callback
. Utilisation guidata ou d'autres approches pour stocker et récupérer des données.Deuxième problème: Utiliser la fonction drawnow(). Voir cet article de Yair Altman pour la bonne explication.
Résumé: MATLAB graphique est Java Swing et opérations d'e /s (comme appuyer sur un bouton) arriver sur un fil spécial - Event Dispatch Thread (HAE). L'appel de drawnow(); bouffées de chaleur file d'attente d'événements et les mises à jour de la figure de la fenêtre.
drawnow()
dans la boucle!