How to stop a while loop using a GUI pushbutton?

119 vues (au cours des 30 derniers jours)
Flávio
Flávio le 13 Nov 2013
Commenté : aung lin le 12 Juil 2022
I have a while loop and I have a STOP pushbutton that breaks the loop. Basically I want to break the loop using the pushbutton instead of typing CTRL+C on command window. I tried the return clause but it didn't work and the break clause aparently it's used inside the loop (which isn't the case).
Can anyone help me?
Thanks!

Réponses (6)

Walter Roberson
Walter Roberson le 13 Nov 2013
while true
drawnow()
stop_state = get(YourPushbuttonHandle, 'Value');
if stop_state
break;
end
...
end
  7 commentaires
Image Analyst
Image Analyst le 29 Juin 2018
App Designer has a different way of using global variables I believe - you don't use the global keyword.
Stephen23
Stephen23 le 29 Juin 2018
@Image Analyst: I have never used App Designer, but as far as I can tell it creates some kind of objects, whose properties are available throughout the app:
What does this have to do with global variables?

Connectez-vous pour commenter.


Image Analyst
Image Analyst le 29 Juin 2018
See my attached little demo. It counts when you click the Go button and stops counting when you click the Stop button.
  5 commentaires
Haotian Xue
Haotian Xue le 16 Mar 2021
It works great, thank you so much.
aung lin
aung lin le 12 Juil 2022
Thank You very much Sir!

Connectez-vous pour commenter.


Birkan GOCERLER
Birkan GOCERLER le 21 Sep 2014

Andrew Davies
Andrew Davies le 15 Sep 2015
the basic outline could look like this:
For the callback of the start push button you want something like this.
functionpushbutton1_Callback(hObject, eventdata, handles)
handles.stop_now = 0; %Create stop_now in the handles structure
guidata(hObject,handles); %Update the GUI data
while ~(handles.stop_now)
yourfunction()
drawnow %Give the button callback a chance to interrupt the %opening fucntion
handles = guidata(hObject); %Get the newest GUI data
end
In the callback for the stop button you want
function pushbutton2_Callback(hObject, eventdata, handles)
handles.stop_now = 1;
guidata(hObject, handles); % Update handles structure

Greig
Greig le 16 Sep 2015
Modifié(e) : Greig le 16 Sep 2015
Essentially of the these solutions are based on the same ideas. Another approach (that uses the same idea) is to use the MATLAB inbuilt waitbar() function, which supports canceling a loop and details how to do in the documentation... FOUND HERE. This way you don't have to explicitly program the canceling functionality of your button 2, which is useful if you are still getting to grips with GUIs.
Edit: And only after answering do I realize this is a somewhat old thread!

Seo-Hyun
Seo-Hyun le 12 Avr 2017
I used a toggle button for pause, and added the pause code in the loop. While pausing, you can always grab a breakpoint in the paused line and continue debug. Try this.
while(1)
if handles.pause.Value
pause(1);
handles.pause.String = 'Resume';
disp('waiting');
while ~handles.pause.Value
handles.pause.String = 'Pause';
break;
end
continue;
end
end
function pause_Callback(hObject, eventdata, handles)

Catégories

En savoir plus sur Interactive Control and Callbacks dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by