Verfasst am: 22.09.2009, 15:19
Titel: While-Schleife durch Button betätigen abbrechen
Wie schon der Titel sagt bin ich (schon) wieder an einem Punkt andem ich auf keinem grünen Zweig stoße
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....
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
Schon mal vielen Dank
_________________
Wartet mal...
Ich geh schnell Klebeband holen um die Metallstangen zusammen zu leimen.
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)
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.
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".
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).
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)
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 .
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.
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'); ifget(handles.bStart,'Value') set(handles.bStart,'Value', false);
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)
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
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)
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
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.