Verfasst am: 22.01.2013, 15:02
Titel: Gui timer raubt mir den letzten Nerv
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);
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...)
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
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);
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 Ich hoffe ihr seht meinen falschen Ansatz.
Besten Dank im Voraus
Euer fekal
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
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.
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
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):
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.
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 Bis demnächst.
Euer fekal
Einstellungen und Berechtigungen
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.