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

GUI und Callback

 

Poseidonius
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 97
Anmeldedatum: 08.07.07
Wohnort: Magdeburg
Version: ---
     Beitrag Verfasst am: 08.07.2007, 20:51     Titel: GUI und Callback
  Antworten mit Zitat      
Mmmmm ...

wie müßte ich die Aufgabenstellung "wenn der Startbutton gedrückt wurde, dann rotiere in einer Schleife und erst mit dem Drücken des Endbutton stoppen" umsetzten?

Denn so:

Code:

function startButton_Callback(hObject, eventdata, handles)

global stop;
stop=false;
global stop_accepted;
stop_accepted=false;

while (stop==false)
     ... do something
end
stop_accepted=true;
disp('job ended')


function endButton_Callback(hObject, eventdata, handles)

global stop;
stop=true;
while (stop_accepted==false) end;
...
disp('Aus Maus');
 


funktioniert es nicht, weil die Callback Schleifen offenbar wirklich sequentiell ausgeführt werden.

Vielen Dank und einen schönen Sonntag noch

Poseidonius
Private Nachricht senden Benutzer-Profile anzeigen


Diddy
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 61
Anmeldedatum: 02.08.07
Wohnort: ---
Version: 2009a
     Beitrag Verfasst am: 07.08.2007, 08:58     Titel:
  Antworten mit Zitat      
Hi,

ich arbeite da mit Structures bzw. Zellen und nur Zahlen als Variablen (keine Logikbefehle).

Mal ein Trivialbeispiel (Grundstruktur wurde mit Guide erstellt)

Code:


function varargout = thermometer(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @thermometer_OpeningFcn, ...
                   'gui_OutputFcn',  @thermometer_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end

function thermometer_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);

global steuer    % deklaration als globale Variable
steuer{1,1}=0; % Steuervariabel, die global dafiniert wird

function varargout = thermometer_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;

% Start-Button
function start_Callback(hObject, eventdata, handles)
global steuer

g=get(hObject,'Value');

if g==1
    steuer{1,1}=0;
   
   
    while steuer{1,1}==0
        ...
    end
end

% Stop-Button
function stop_Callback(hObject, eventdata, handles)
global steuer

g=get(hObject,'value');
if g==1
   
    steuer{1,1}=1;
end
 


Wenn ich also den Start-Button drücke, wird die Steuervarible auf 0 gesetzt und die Schleife läuft durch. Sobald der Stopbutton gedrückt wird, wird die variable auf 1 gesetzt und die Schleife wird beendet.

Wie gesagt, ein Trivialbeispiel. Ich nutze die Zellen mit weit mehr Variablen, je nach Anzahl der Aufgaben.

Ich hoffe mal, ich konnte dir weiter helfen.

MfG
Christian
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 22.08.2007, 17:04     Titel: Zusätzlicher Tipp
  Antworten mit Zitat      
Hallo Ihr,

ich hab das mal ausprobiert, und mit einer ganz blöden Schleife wie

Code:

if g==1
    steuer{1,1}=0;
   
    k=1;
    while steuer{1,1}==0
        k=k+1
    end
end
 


geht es nicht! Scheinbar kann die zweite Funktion nicht dazwischenfunken, es sieht also nach sequentieller Abarbeitung aus. Wenn man allerdings eine 1-Sekunden-Pause einbaut:

Code:

if g==1
    steuer{1,1}=0;
   
    k=1;
    while steuer{1,1}==0
        k=k+1
        pause(1)
    end
end
 


geht es auf einmal! Jetzt kann man in der Pause den Stop-Button drücken und die Schleife hält tatsächlich an. Fand ich bemerkenswert, daher habe ich es gepostet, obwohl die Anfrage schon so lang her ist.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.09.2007, 21:11     Titel:
  Antworten mit Zitat      
Noch eine Variante - mit nur einer Taste.

Code:

function while_loop_control
figure
uicontrol('style','togglebutton','string','start','callback',@do_something)

function do_something(obj,cancel)
set(obj,'String',setxor({'start' 'stop'},get(obj,'String')))
%
while strcmp('stop',get(obj,'String'))
   disp(rand(1))
   drawnow
end% while
 


MfG

P.S. Sorry - leider weiss ich nicht wie ich den Code so schön umrahmen kann wie die anderen es tun... Sad

EDIT START by Martin: Habs für dich erledigt Wink Geht ganz einfach. Rechts neben B I U Quote gibt es auch Code, damit geht das. EDIT ENDE
 
Poseidonius
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 97
Anmeldedatum: 08.07.07
Wohnort: Magdeburg
Version: ---
     Beitrag Verfasst am: 28.09.2007, 09:18     Titel: Callback Funktionen unterbrechen
  Antworten mit Zitat      
Hallo zusammen,

vielen Dank für Eure Anmerkungen ... ich habe mich noch mal mit der Frage beschäftigt und in meinem Lieblingsbuch "Mastering Matlab" die Aussage gefunden, die Eure Programmbeispiele bestätigt:

In all cases a callback executes until it reaches a waitfor, waitforbuttonpress, drawnow, getframe, pause or figure command. Callbacks that not contain any of these commands cannot be interrupted.

Also muss eines der Schlüsselworte in der function auftauchen ...

Nur noch zur Info

Schönes Wochenende

Poseidonius
Private Nachricht senden Benutzer-Profile anzeigen
 
MatLabNooB
Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2010, 02:33     Titel:
  Antworten mit Zitat      
also ich habs versucht und langsam werd ich verrückt!

der button "start" setzt etwa folgende schleife in gang:
Code:
while frame < numel(stack_properties)
% hier wird jetzt ein RGB-Bild zusammengesetzt und über imshow ausgegeben
drawnow
         if get(handles.stopp,'Value')
             waitfor(handles.stopp,'Value',0)
         end
end

weiter der button "stopp":
Code:
% --- Executes on button press in stopp.
function stopp_Callback(hObject, eventdata, handles)
% hObject    handle to stopp (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% uiwait
set(handles.stopp,'Value',1)
guidata(hObject, handles);


er will mir die schleife aber bei besten willen nicht stoppen, mit uiwait klappt es, aber wenn ich uiresume benutze und in der zwischenzeit paar werte über andere buttons verändert habe gibt mit die schleife nen fehler, weil sie noch mit den alten werten arbeitet?
Private Nachricht senden Benutzer-Profile anzeigen
 
MatLabNooB
Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2010, 18:38     Titel:
  Antworten mit Zitat      
habs jetzt mit nem Panel und 2 gekoppelten radiobuttons gelöst...
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.