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 timer raubt mir den letzten Nerv

 

fekal
Forum-Century

Forum-Century



Beiträge: 124
Anmeldedatum: 08.02.11
Wohnort: Mainz
Version: 2017b
     Beitrag Verfasst am: 22.01.2013, 15:02     Titel: Gui timer raubt mir den letzten Nerv
  Antworten mit Zitat      
Liebe Matlab Gemeinde,
ich hoffe ich schreibe nicht zu konfus und ihr erkennt meine(n) Fehler sofort.

Ich will in einer Gui das Einlesen von Daten mittels eines Timer wiederholen. Ich hab nun schon viele Varianten ausprobiert, komme aber zu keinem Ergebnis.

Variante 1: Timer in opening funktion als handle deklarieren und übergeben wie in den meisten Forenbeiträgen beschrieben.
Code:
function Oberflaeche_OpeningFcn(hObject, eventdata, handles, varargin)

handles.Timer = timer(...
     'TimerFcn',{@timeroverflow,handles},...  % oder hObject statt handles, oder ,guidata(handles.figure1) statt handles
    'ExecutionMode','fixedRate',...          
     'BusyMode','queue',...                  
     'Period',0.05);    

handles.output=hObject;
guidata(hObject, handles);                    
 

Das ganz wie im kommentar erwähnt auch mit ...{@timeroverflow,hObject} oder {@timeroverflow,guidata(handles.figure1)}

Mit Pushbutton wird gestartet start(handles.Timer);

und öffnet die Timer funktion
Code:
function timeroverflow(hObject,eventdata,handles)              
 %handles=guidata(handles);   %hiermit will ich die handles erneuern, erzeugt jedoch Fehler im Zusammenhang mit handle (H must be a Handle to a figure...)

 evalin('base','CAN_receive');

    guidata(hObject, handles);                    
 

Es entsteht der Fehler "to many output requests. Most likely..."
Lasse ich hObject und eventdata als Übergabeparameter weg (sind eigentlich fix vorgesehen und müssen da stehen), gibt´s den Fehler to many input requests. scheint logisch.

Diese Fehler erscheinen bei allen möglichen Kombinationen der Übergabeparameter von handles und hObject in der definition des timers und der timer Funktion

Variante 2: nicht die handles übergeben sondern die Handles der GUI figure und diese mit Guidata extrahieren wie hier beschrieben http://www.mathworks.co.uk/matlabce.....reader/view_thread/239873

Code:
function Oberflaeche_OpeningFcn(hObject, eventdata, handles, varargin)

f=gfc;
data = guihandles(f);

 data.Timer = timer(...
     'TimerFcn',{@timeroverflow,f},...  
     'ExecutionMode','fixedRate',...          
     'BusyMode','queue',...                  
     'Period',0.05);  

handles.output=hObject;
guidata(hObject, handles);                      
 


Ebenfalls mit Pushbutton starten, nun aber "f" mit übergeben
Code:
function STARTbutton_Callback(obj,event,handles,f)
guidata(f,data);            % Struktur reinholen
start(data.Timer);          % Starten des Timers

guidata(hObject,handles);      
 

Code:
function timeroverflow(hObject,eventdata,handles,f)        
 handles=guidata(handles);
 evalin('base','CAN_receive');

    guidata(hObject, handles);                    %updaten
 

Hier kommt wieder "not enough input arguments" wenn ich "handles" als input weglasse, so kennt der Compiler "data" nicht. start(handles.Timer) ergibt die gleichen Fehler.

Variante 3: Timer erst in der Callback des startbutton deklarieren
Code:
function STARTbutton_Callback(hObject,eventdata,handles)

Timer=timer(...    
    'TimerFcn',{@timeroverflow, handles},...  %auch hier mit hObject kein Erfolg
    'ExecutionMode','fixedRate',...          
    'BusyMode','queue',...                  
    'Period',0.05);                          
start(Timer);          

guidata(hObject,handles);

hier Erscheinen je nach Übergabeparameter die gleichen Fehler wie bei Variante 1
" to many output requests.Most likely...","H must be a..."

Ich hoffe ich habe nicht zu unübersichtlich geschrieben. Ich habe schon viel versucht. Leider nur nicht das Richtige Smile Ich hoffe ihr seht meinen falschen Ansatz.
Besten Dank im Voraus
Euer fekal
Private Nachricht senden Benutzer-Profile anzeigen


LittleX
Forum-Guru

Forum-Guru


Beiträge: 494
Anmeldedatum: 14.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2013, 10:03     Titel:
  Antworten mit Zitat      
Hi,

also wenn ich jetzt mal von Variante 1 ausgehe:

Den Timer würde ich in der OpeningFcn genauso anlegen wie Du es jetzt schon machst.

Code:

function Oberflaeche_OpeningFcn(hObject, eventdata, handles, varargin)
handles.Timer = timer(...
     'TimerFcn',{@timeroverflow,handles},...  % oder hObject statt handles, oder ,guidata(handles.figure1) statt handles
    'ExecutionMode','fixedRate',...          
     'BusyMode','queue',...                  
     'Period',0.05);    

handles.output=hObject;
guidata(hObject, handles);                    
 


Der Timer wird dann durch einen Pushbutton gestartet:
Code:

function STARTbutton_Callback(obj,event,handles)
start(handles.Timer);          % Starten des Timers
 


Und der Callback sieht so aus:
Code:

function timeroverflow(hObject,eventdata,handles)  
% Mir ist gerade nicht ganz klar, warum Du nochmal die guidata laden willst, da Du ja nichts mit handles machst. Aber wenn dann darfst Du nicht die Struktur selbst übergeben, sondern z.B. das handle auf des Fenster. Ich hab hier mal handles.figure1 geschrieben, Du musst halt selber gucken, wie das Feld bei Dir heißt)    
 handles=guidata(handles.figure1);
 evalin('base','CAN_receive');

% Auch hier gilt: Du musst wenn dann das handle auf des Fenster übergeben. hObject ist in dieser Funktion das Timer-Objekt)
    guidata(handles.figure1, handles);                    %updaten
 
 


Viele Grüße,

LittleX
Private Nachricht senden Benutzer-Profile anzeigen
 
fekal
Themenstarter

Forum-Century

Forum-Century



Beiträge: 124
Anmeldedatum: 08.02.11
Wohnort: Mainz
Version: 2017b
     Beitrag Verfasst am: 23.01.2013, 11:10     Titel:
  Antworten mit Zitat      
Hallo LittleX,

vielen Dank für deine Antwort. Leider bekomme ich immer noch den Fehler :
"Too many outputs requested. Most likely cause is missing [] around
left hand side that has a comma separated list expansion."

ich wunder mich auch, denn im Forum wird das überall so gemacht. Übersehe ich da was?

Du hast aber mit dem guidata recht. Das ist da eigentlich überflüssig. Ich wollte nur sichergehen, dass ich mit den aktualisierten handles arbeite.

Ich hab in einem anderen Beitrag gelesen, dass ich oben bei der Timer Deklaration nicht handles übergeben soll, sondern hObject (also {@timeroverflow,hObject}). Wie in meinem Beitrag geschrieben funktioniert das leider auch nicht.

Trotzdem vielen Dank
fekal
Private Nachricht senden Benutzer-Profile anzeigen
 
LittleX
Forum-Guru

Forum-Guru


Beiträge: 494
Anmeldedatum: 14.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2013, 11:41     Titel:
  Antworten mit Zitat      
Hallo,

In welcher Zeile/bei welchem Befehl taucht denn der Fehler auf.
Poste doch bitte mal die ganze Meldung und die entsprechende Zeile.

Ich habe mal eine Mini-GUI mit Timer beigefügt: probier doch mal aus, ob das Mini-Beispiel bei Dir geht.

Viele Grüße,

LittleX

timerGUI.zip
 Beschreibung:

Download
 Dateiname:  timerGUI.zip
 Dateigröße:  3.23 KB
 Heruntergeladen:  464 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
fekal
Themenstarter

Forum-Century

Forum-Century



Beiträge: 124
Anmeldedatum: 08.02.11
Wohnort: Mainz
Version: 2017b
     Beitrag Verfasst am: 23.01.2013, 13:50     Titel:
  Antworten mit Zitat      
Hallo Jungs,

Juhuu ich habe endlich den Fehler gefunden, aber nicht verstanden.

Danke LittleX für dein Programm. Das ist natürlich gelaufen.
Ich hab in der timer funktion am ende die handels "updaten"wollen mit

Code:

function timeroverflow(hObject,eventdata,handles)      
 
disp('blub')

guidata(hObject,handles);                    %updaten
 


ohne guidata(hObject,handles); funktioniert es. Aber wieso? Kann ich nicht wie in jedem andern Teilabschnitt des Programms meine handles mit guidata updaten?

Danke für Eure Hilfe. Nach langer Zeit endlich ein Lichtblick. Jetzt kann ich weiter programmieren und auf den nächsten Fehler stoßen Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
LittleX
Forum-Guru

Forum-Guru


Beiträge: 494
Anmeldedatum: 14.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2013, 14:00     Titel:
  Antworten mit Zitat      
Hallo,

schon einmal gut, dass es nun läuft.

hObject in der Timer Funktion enthält kein Grafikobjekt, sondern das Timerobjekt. guidata erwartet aber, ein handle auf ein Fenster (oder allgemein ein Grafikobjekt).
Du müsstest also wenn dann so etwas in der Art aufrufen (unter der Annahme, die handles Struktur enthält ein Feld figure1):
Code:

guidata(handles.figure1,handles)
 

Wofür brauchst Du das update von guidata überhaupt? Das macht nur Sinn, wenn Du die Variable handles änderst und die Änderungen in der GUI verfügbar machen möchtest.

Viele Grüße,

LittleX
Private Nachricht senden Benutzer-Profile anzeigen
 
fekal
Themenstarter

Forum-Century

Forum-Century



Beiträge: 124
Anmeldedatum: 08.02.11
Wohnort: Mainz
Version: 2017b
     Beitrag Verfasst am: 23.01.2013, 14:08     Titel:
  Antworten mit Zitat      
ahhh , das macht Sinn

im späteren Verlauf wird möglicherweise einiges in die Timerfunktion aufgenommen. Dafür wollte ich schon mal vorsorgen.

Tausend Dank LittleX für die Erläuterung.

Vielen Dank an alle für eure Hilfe Exclamation Bis demnächst.
Euer fekal
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 - 2025 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.