WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

While-Schleife durch Button betätigen abbrechen

 

Robo SSC-32
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 16.09.09
Wohnort: Ulm
Version: R2008a
     Beitrag Verfasst am: 22.09.2009, 15:19     Titel: While-Schleife durch Button betätigen abbrechen
  Antworten mit Zitat      
Wie schon der Titel sagt bin ich (schon) wieder an einem Punkt andem ich auf keinem grünen Zweig stoße Sad

Und zwar geht es um Folgendes:
Ich möchte wenn ein Push Button getätigt wurde eine kontinuierliche 'Aufzeichnung starten' und beim betätigen eines weiteren Buttons wieder stoppen.
Bisher wollte ich das mit einer while Schleife realisieren, mit einer Variablen die auf 1 gesetzt wurde und beim betätigen des Stop Buttons auf Null. Das Problem hierbei das die Schleife nie mals aufhört. Die Funktion in der sich die while Schleife befindet bekommt nicht mit das die Variable bereits auf 0 gesetzt wurde.... Confused

So sieht im Moment mein Start Button aus: (Aus testzwecken wird hier auf ein static text geschrieben anstelle von den Aufzeichnungen)
Code:
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%handles.run = 1;
while (handles.run == 1)
    satz = {'Hurra ich darf den Ram vollschreiben!!'};
    theBreak = find(handles.run == 0);  
    %theBreak =  handles.run;
      if theBreak == 1
          return;
      end
    handles.output = [handles.output; satz];
    set(handles.text1,'String',handles.output)
    pause(1);
end


Wie man auch sehen kann hab ich auch eine if abfrage in der while was da nicht so wirklich sinn macht, aber anhand dessen sieht man wie ratlos ich seit stunden an diesem Problem rumbastle...

Hier der button der das stoppen soll:

Code:
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

if handles.run == 1
    handles.run = 0;
end;
set(handles.text1,'String','SO JETZT IS ABER SCHLUSS!')
% Update handles structure
guidata(hObject, handles);
set(handles.text2,'String',num2str(handles.run))



So jetzt bin ich auf Hilfe angewiesen... Ich hab mir auch schon überlegt ob man das auch mit event listener lösen könnte, doch hab ich das noch nicht zum funktionieren gebracht... Falls jemand auch weiß wie ich das mit den listener in Matlab löse möchte ich gerne diesen Lösungsweg gezeigt bekommen Wink

Schon mal vielen Dank
_________________

Wartet mal...
Ich geh schnell Klebeband holen um die Metallstangen zusammen zu leimen.
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 23.09.2009, 01:27     Titel:
  Antworten mit Zitat      
Hallo


wenn so wie du jetzt hast, umsetzen möchtest, dann musst du in m while immer handles aktualisieren.
Das deswegen so, weil du in pushbutton2 die handles veränderst und
speicherst diese, das wird aber der pushbutton1 nicht mitteilt und wird weiterhin alte handles verwendet.


Code:

function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%handles.run = 1;
while (handles.run == 1)
    satz = {'Hurra ich darf den Ram vollschreiben!!'};
    % handels aktualisieren
    handles = guidata(hObject);
    theBreak = find(handles.run == 0);  
    %theBreak =  handles.run;
      if theBreak == 1
          return;
      end
    handles.output = [handles.output; satz];
    set(handles.text1,'String',handles.output)
    pause(1);
end
 


besser wenn du aber in button , Value oder UserData Property verwendest, dann sind die Werte schneller verfügbar
Code:

function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
while ~get(handles.pushbutton1,'Value')
    satz = {'Hurra ich darf den Ram vollschreiben!!'};
    handles.output = [handles.output; satz];
    set(handles.text1,'String',handles.output)
    pause(1);
end

function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

stat= get(handles.pushbutton1,'Value');

set(handles.pushbutton1,'Value', ~stat);

set(handles.text1,'String','SO JETZT IS ABER SCHLUSS!')
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Robo SSC-32
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 16.09.09
Wohnort: Ulm
Version: R2008a
     Beitrag Verfasst am: 23.09.2009, 10:14     Titel:
  Antworten mit Zitat      
Danke Very Happy
Und wieder mal eine große Hilfe gewesen Cool

Special Thanks 2 denny Wink
_________________

Wartet mal...
Ich geh schnell Klebeband holen um die Metallstangen zusammen zu leimen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Buhmann
Forum-Anfänger

Forum-Anfänger



Beiträge: 30
Anmeldedatum: 25.05.11
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 12.03.2012, 15:28     Titel:
  Antworten mit Zitat      
Hallo zusammen.

Ich habe ein ähnliches Problem. Beim Suchen bin ich auf dieses Thema gestoßen, daher poste ich es hier rein.

Ich möchte im Prinzip das selbe machen, nur ohne die guidata/eventdata/handles-Geschichte:

Hier der Programmcode:
Code:

...
hOK = uicontrol('Style','pushbutton','String','OK',...
        'Callback','stopp = 1');

while ~stopp
    stopp    % nur zum debuggen
    pause(1)
    % mach irgendwas
end
delete(hOK)
...
 


auch so hab ich's schon probiert:
Code:

...
hOK = uicontrol('Style','pushbutton','String','OK',...
        'Callback','stopp = 1');

while 1
    stopp    % nur zum debuggen
    if stopp
        delete(hOK)
        break
    end
    pause(1)
    % mach irgendwas
end
...
 


Ich steh' voll auf dem Schlauch.
Sobald ich auf den Button klicke, wird die Variable stopp auf 1 gesetzt, aber in jedem Schleifendurchlauf wird sie wieder mit stopp = 0 ausgegeben.
Schreibt der Button in irgendeinen anderen Namespace rein?
Ich habs auch schon mit einer globalen Variablen ausprobiert, auch ohne Erfolg.

*Bitte um Hilfe*
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.03.2012, 22:58     Titel:
  Antworten mit Zitat      
Hallo Buhmann,

Die callbacks werden im Base-Workspace ausgeführt. Dein "stopp" wird also davon nicht berührt.
Die beste Möglichkeit wäre die "guidata/eventdata/handles-Geschichte".

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 13.03.2012, 09:06     Titel:
  Antworten mit Zitat      
Hey,

ich würde aber ein drawnow anstatt einer pause bevorzugen, da durch die Pause die sowieso schon langsame while Schleife doch extrem an Geschwindigkeit verliert (es sei denn, dass die 1 Sekunde Pause gewollt ist).

Greetings
Private Nachricht senden Benutzer-Profile anzeigen
 
MarekJosef
Forum-Anfänger

Forum-Anfänger


Beiträge: 36
Anmeldedatum: 10.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.04.2013, 11:53     Titel:
  Antworten mit Zitat      
Hallo. Ich habe eine Frage zu folgendem Code:

denny hat Folgendes geschrieben:


besser wenn du aber in button , Value oder UserData Property verwendest, dann sind die Werte schneller verfügbar
Code:

function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
while ~get(handles.pushbutton1,'Value')
    satz = {'Hurra ich darf den Ram vollschreiben!!'};
    handles.output = [handles.output; satz];
    set(handles.text1,'String',handles.output)
    pause(1);
end

function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

stat= get(handles.pushbutton1,'Value');

set(handles.pushbutton1,'Value', ~stat);

set(handles.text1,'String','SO JETZT IS ABER SCHLUSS!')
 



Bei mir funktioniert dies nicht. Er geht nicht mal in die While-Schleife hinein. Könnte es sein, dass die beiden pushbuttons 1 und 2 verstauscht wurden? Und fehlt nicht irgendwo ein "drawnow" oder eine Funktion, welche die Handles aktualisiert? Bitte um Hilfe Smile.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 03.04.2013, 16:07     Titel:
  Antworten mit Zitat      
Hallo

wie immer der Ausdruck "funktioniert nicht" ist hier nicht wirklich hilfreich.

Also da meine Antwort sich auf die Threadersteller-Frage bezog, ist dadurch mein Vorschlag nur auf sein Problem angepasst. Ich habe keine Ahnung, was die Variablen handles.output oder handles.text1 dort bedeuten und wie der Fragesteller sie später nutzt. Das habe ich blind aus seine Code-Beispiel übernommen. Deshalb ist das auf deinen Fall muss ganz genau angepasst werden.

Zitat:
Und fehlt nicht irgendwo ein "drawnow" oder eine Funktion, welche die Handles aktualisiert? Bitte um Hilfe


Man kann entweder DRAWNOW oder PAUSE nutzen um die Zeit für die Aktualisierung geben.
Ob die GUIDATA notwendig ist hängt ja von dem ab, ob du die Änderungen anderen Funktion verfügbar machen willst.

Hier zum Verständnis lauffähige Funktion:
Code:
function figure_callback
fig     = figure();

handles.bStart = uicontrol(  ...
   fig                           ,...
   'Style', 'pushbutton'         ,...
   'String', 'start'             ,...
   'Position', [20 320 100 30]   ,...
   'UserData',0                  );


handles.bStop = uicontrol(  ...
   fig                           ,...
   'Style', 'pushbutton'         ,...
   'String', 'stop'              ,...
   'Position', [140 320 100 30]  );

handles.fig       = fig;


guidata(fig,handles);

set(handles.bStart,'Callback', {@run_loop,  handles})
set(handles.bStop, 'Callback', {@stop_loop, handles})



function run_loop(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
fprintf('Starting!\n');
% stat = get(handles.pushbutton1,'Value');
if get(handles.bStart,'Value')
   set(handles.bStart,'Value', false);
end

while ~get(handles.bStart,'Value')
   fprintf('Running!\n');
   pause(1);
end

function stop_loop(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

stat= get(handles.bStart,'Value');

set(handles.bStart,'Value', ~stat);
fprintf('Stopping!\n');
Private Nachricht senden Benutzer-Profile anzeigen
 
NinaPopina
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 29.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.10.2013, 15:48     Titel:
  Antworten mit Zitat      
hey, ich hab ebenfalls ein Problem zu diesem Thema.

ich habe bereits eine while-schleife angelegt die mit einem startbutton beginnt.
ich möchte, dass die schleife mit einem stopbutton (pushbutton2) beendet wird..
ich dachte daran i=20 zu setzen, sodass die die unten stehende Bedingung nicht mehr erfüllt ist. Aber mir ist nicht klar wie.


Code:
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Messdaten: Vektor x
i = 1;
pause on;
while(i<20)
x = rand(19,1)*1000;
% Vektor x in text1-text7 abbilden
set(handles.text1,'String',x(1));
set(handles.text2,'String',x(2));
set(handles.text3,'String',x(3));
set(handles.text4,'String',x(4));
set(handles.text5,'String',x(5));
set(handles.text6,'String',x(6));
set(handles.text7,'String',x(7));
i=i+1;
pause(2);
end


Wäre super wenn ihr mir helfen könntet:)
Viele Grüße
Nina
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 31.10.2013, 23:31     Titel:
  Antworten mit Zitat      
Hallo

Na in diesem Fall wäre UserData geeignet,
also musst statt Index i UserData nutzen:
Code:


function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Messdaten: Vektor x
set(handles.pushbutton1, 'UserData', 1)
%pause on;
while(get(handles.pushbutton1, 'UserData')<20)
  i = get(handles.pushbutton1, 'UserData')
  x = rand(19,1)*1000;
% Vektor x in text1-text7 abbilden
  set(handles.text1,'String',x(1));
  set(handles.text2,'String',x(2));
  set(handles.text3,'String',x(3));
  set(handles.text4,'String',x(4));
  set(handles.text5,'String',x(5));
  set(handles.text6,'String',x(6));
  set(handles.text7,'String',x(7));
  i=i+1;
  set(handles.pushbutton1, 'UserData', i)
  pause(2);
end

% dann in deinem stopbutton:

function pushbutton2_Callback(hObject, eventdata, handles)
set(handles.pushbutton1, 'UserData', 20)

 
Private Nachricht senden Benutzer-Profile anzeigen
 
NinaPopina
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 29.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.11.2013, 11:29     Titel:
  Antworten mit Zitat      
Vielen Dank!!! Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.