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

Funktionsaufruf in OpeningFcn

 

Joeh
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 06.04.11
Wohnort: ---
Version: R2009a
     Beitrag Verfasst am: 31.05.2011, 19:46     Titel: Funktionsaufruf in OpeningFcn
  Antworten mit Zitat      
Hallo Zusammen,

ich stehe gerade mit der opening function etwas auf Kriegsfuß. Und zwar habe ich jetzt zum 2.mal versucht einen Befehl oder eine Funktion in der OpeningFcn auszufühern und beide male Probleme damit gehabt. Vielleicht könnte mir jemand die mir unbekannten Besonderheiten der OpeningFcn erklären. Wäre echt super!


1.Situation:

uicontrol(buttonhandle)

-> soll eigentlich den Fokus auf einen bestimmten Button legen. Funktioniert einfach nicht. Keine Fehlermeldung


2.Situation:

Ich starte eine Funktion in der ein Timer erzeugt und gestartet wird. Die handle zum Timer wird mit guidata übergeben

-> Timer wird korrekt gestartet und in der OpeningFcn kann auch noch einwandfrei auf de Timer zugegriffen werden. Möchte ich jedoch außerhalb der OpeningFcn auf den Timer zugreifen ist er invalid. Die handle wird aber eigentlich korrekt übergeben.


Beide Sachen funktionieren in einen Button gepackt ohne Probleme. Vielleicht haben beide Situationen ja auch nichts gemeinsam. Aber ich als Matlab Neuling vermute, dass es da irgendwas zu beachten gibt. Wie kann ich also die 2 oben genannten Sachen beim Start einer GUI aufrufen ohne einen extra Button einzubauen?
Private Nachricht senden Benutzer-Profile anzeigen


tompie
Forum-Guru

Forum-Guru


Beiträge: 260
Anmeldedatum: 19.09.07
Wohnort: München
Version: immer alles
     Beitrag Verfasst am: 01.06.2011, 10:05     Titel:
  Antworten mit Zitat      
Hallo,

das Problem mit der GUI opening function ist, daß sie bei dem ganzen GUI-Initialisierungsprozess sehr früh aufgerufen wird und danach noch alle möglichen anderen Sachen ablaufen, die vom User nicht kontrolliert werden können (u.a. der Befehl movegui, der mühevolle GUI-Positionierungen in der opening function wieder zunichte macht...).

Daher mein Rat: Wenn ihr am GUI noch etwas ändern wollt oder sonstige Funktionen starten/initialiseren wollt, dann tut dies am besten in der output function (also _OutputFcn). Das klingt absurd, aber dieser Code-Teil wird bei der GUI-Initialisierung als letztes aufgerufen. Danach kann also keine "schädliche" Funktion seitens Matlab mehr ablaufen.

Das Prinzip lässt sich auch für das Problem der GUI-Maximierung anwenden.

Gruß tompie
Private Nachricht senden Benutzer-Profile anzeigen
 
Joeh
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 06.04.11
Wohnort: ---
Version: R2009a
     Beitrag Verfasst am: 01.06.2011, 11:17     Titel:
  Antworten mit Zitat      
Danke tompie,

das mit der output function ist eine einfache und gute Idee. Bei der erwähnten 1. Situation und Ähnlichem ist das Problem damit gelöst.

ABER bei dem Timer tritt leider das gleiche Problem auf wie schon in der opening function. Nachdem output function fertig durchlaufen ist ist der Timer ungültig.

Irgendwelche Ideen? Den Timer est mit einem Button zu starten ist schon recht unschön...
Private Nachricht senden Benutzer-Profile anzeigen
 
tompie
Forum-Guru

Forum-Guru


Beiträge: 260
Anmeldedatum: 19.09.07
Wohnort: München
Version: immer alles
     Beitrag Verfasst am: 01.06.2011, 11:57     Titel:
  Antworten mit Zitat      
Hallo,

das mit dem timer sollte auf jeden Fall funktionieren, auch in der opening function. Wahrscheinlich gibt es ein anderes Problem. Wie sieht denn deine Timer-Deklaration genau aus? Werden evtl. die timer-Callbacks zur Laufzeit nicht gefunden?

Gruß tompie
Private Nachricht senden Benutzer-Profile anzeigen
 
Joeh
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 06.04.11
Wohnort: ---
Version: R2009a
     Beitrag Verfasst am: 02.06.2011, 15:21     Titel:
  Antworten mit Zitat      
So, hat etwas gedauert, weil ich die ganze Sache erst mal auf das Wesentliche kürzen musste. Ein paar Sachen mögen aus dem Zusammenhang gerissen sinnlos wirken...

Meine Main_GUI: hier wird der Timer Deklariert und die sub_GUI aufgerufen in der der Timer automatisch starten soll

Code:
% --- Executes on button press in pb_start_sub.
function pb_start_sub_Callback(hObject, eventdata, handles)
% hObject    handle to pb_start_sub (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if ~isfield(handles,'sub_GUI') % check ob sub_GUI in handles entahlten ist.
    handles.sub_GUI = sub_GUI(handles.main_GUI,@start_timer); %die Funktion sub_GUI starten,handles übergeben und zurückgegebene handles speichern
    guidata(hObject,handles) % guidata aktualisieren
else
   figure(handles.sub_GUI); % bringt sub_GUI in den Vordergrund
end
%--------------------------------------------------------------------------



function start_timer(delta_t,vis_fcn_h, outputplace_h,handle_to_main_GUI)

main_GUI_handles=guidata(handle_to_main_GUI);
main_GUI_handles.read = timer('ExecutionMode','fixedRate','TimerFcn', {@timer_fcn, handle_to_main_GUI, vis_fcn_h, outputplace_h}, 'Period', delta_t );
guidata(handle_to_main_GUI, main_GUI_handles);
start(main_GUI_handles.read);
%--------------------------------------------------------------------------

function timer_fcn(hObject, eventdata, handle_to_main_GUI, vis_fcn_h, outputplace_h)

read_value_pair(handle_to_main_GUI);
feval(vis_fcn_h,outputplace_h,handle_to_main_GUI);
%--------------------------------------------------------------------------

function   read_value_pair (handle_to_main_GUI)

main_GUI_handles=guidata(handle_to_main_GUI);
main_GUI_handles.mpn=main_GUI_handles.mpn+1;

if main_GUI_handles.mpn== 1
    main_GUI_handles.datensatz.force(main_GUI_handles.mpn)=0.04;
    main_GUI_handles.datensatz.length(main_GUI_handles.mpn)=0.05;
else
    main_GUI_handles.datensatz.force(main_GUI_handles.mpn)= main_GUI_handles.datensatz.force(main_GUI_handles.mpn-1) + randi([1,10])/10000;
    main_GUI_handles.datensatz.length(main_GUI_handles.mpn)= main_GUI_handles.datensatz.length(main_GUI_handles.mpn-1)+ randi([1,10])/10000;
end

guidata(handle_to_main_GUI, main_GUI_handles);
%--------------------------------------------------------------------------

function  plot_force(outputplace_h, handle_to_main_GUI)

main_GUI_handles=guidata(handle_to_main_GUI);
plot(outputplace_h,[main_GUI_handles.datensatz.force(main_GUI_handles.mpn),main_GUI_handles.datensatz.force(main_GUI_handles.mpn)],[0, 10]);
drawnow;



Meine sub_GUI: Hier wird der Timer in der openingFcn gestartet. In der Opening kann ich wie beschrieben noch auf den Timer zugreifen, später aber nicht mehr. Gleiches passiert wie gesagt auch wenn ich es in die outputFcn packe. Über einen Button gestartet läuft aber alles

Code:
% --- Executes just before sub_GUI is made visible.
function sub_GUI_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to sub_GUI (see VARARGIN)

handles.main_GUI = varargin{1}; % handle auf die figures des Hauptprogramms in handlestruktur des sub_GUI_preload GUIs kopieren
handles.fcn_handle = varargin{2};

% Choose default command line output for sub_GUI
handles.output = hObject;

% Update handles structure

guidata(hObject, handles);
delta_t=0.1;
vis_fcn_h='plot_force';
outputplace_h=handles.axes1;    
feval(handles.fcn_handle,delta_t,vis_fcn_h, outputplace_h,handles.main_GUI);
 


Bin echt ratlos und freue mich über jedes Feedback. Ist immerhin mein erstes richtige Programm und sicher alle andere als perfekt Very Happy.

sub_GUI.m
 Beschreibung:

Download
 Dateiname:  sub_GUI.m
 Dateigröße:  5.48 KB
 Heruntergeladen:  376 mal
sub_GUI.fig
 Beschreibung:

Download
 Dateiname:  sub_GUI.fig
 Dateigröße:  4.19 KB
 Heruntergeladen:  407 mal
main_GUI.m
 Beschreibung:

Download
 Dateiname:  main_GUI.m
 Dateigröße:  5.1 KB
 Heruntergeladen:  428 mal
main_GUI.fig
 Beschreibung:

Download
 Dateiname:  main_GUI.fig
 Dateigröße:  1.76 KB
 Heruntergeladen:  368 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
tompie
Forum-Guru

Forum-Guru


Beiträge: 260
Anmeldedatum: 19.09.07
Wohnort: München
Version: immer alles
     Beitrag Verfasst am: 08.06.2011, 15:14     Titel:
  Antworten mit Zitat      
Hallo,

der Sinn der feval-Funktion in timer_fcn ist mir nicht klar geworden. Kannst Du das bitte mal genauer beschreiben?

Gruß tompie
Private Nachricht senden Benutzer-Profile anzeigen
 
Joeh
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 06.04.11
Wohnort: ---
Version: R2009a
     Beitrag Verfasst am: 24.06.2011, 15:40     Titel:
  Antworten mit Zitat      
Sorry für die späte Antwort! War im Urlaub... Aber vielleicht kannst du mir ja dennoch weiter helfen.
Also die feval-Funktion löst die von der main_GUI übergebene Funktion (in diesem Fall 'start_timer') aus (die sich auch in der main_GUI befindet).

Die Funktionen aus dem m-file der main_GUI raus nehmen bringt übrigens auch keine Besserung.
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.