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

Auf letzten Timerdurchlauf warten

 

Joeh
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 06.04.11
Wohnort: ---
Version: R2009a
     Beitrag Verfasst am: 09.11.2011, 11:50     Titel: Auf letzten Timerdurchlauf warten
  Antworten mit Zitat      
Hallo,

leider stehe ich derzeit etwas auf Kriegsfuß mit Timern. Evil or Very Mad

Es geht grob darum, dass in einer GUI mit einem Button ein endlos mit einer festen Frequenz laufender Timer gestoppt werden soll. Genauer gesagt soll der Timer solange normal weiter laufen, bis er in der button_callback gestoppt wird, dann soll noch bis zum Ende durchlaufen und danach soll die button_callback weiter abgearbeitet werden.

Aber leider wird in der button_callback nicht gewartet bis der Timer seinen letzten durchlauf beendet hat.

wait(timer) funktioniert leider nicht, da „Can't wait with a timer that has an infinite TasksToExecute.“
Außerdem prüft der wait Befehl ja nur ob 'Running' 'on' oder 'off' ist und nicht ob der letzte Durchlauf des Timers tatsächlich beendet wurde.

Eine Idee wäre es wohl den restlichen Teil der button_callback in die StopFcn des timers zu packen. Aber da der Timer an den unterschiedlichsten Stellen gestoppt werden soll, und dann auch auf Unterschiedliche Weisen fortgefahren werden soll, hätte ich dann eine recht unübersichtliche Lösung mit swich case...

Hat Jemand eine andere Idee? Vielleicht sogar einfach nur einen Befehl ähnich zu 'wait' den ich übersehen habe?

Danke schonmal!
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: 11.11.2011, 13:01     Titel:
  Antworten mit Zitat      
Hallo,

leider bin ich immer noch nicht weiter. Hat denn keiner eine Idee? Ich bin für wirklich jede Anregung dankbar.

Aktuell habe ich noch folgendes probiert:

In der Button_Callback wird ein Flag gesetzt und die Programmausführung wird angehalten:

Code:

handles.stop_timer=1; %Stop-Flag setzen
guidata(hObject, handles); %geänderte Daten speichern
uiwait;
handles=guidata(handles.main_GUI); %Im Timer geänderte Daten laden
handles.stop_timer=0; %Flag resetten
 



Am Ende eines Timerdurchlaufs lade ich dann die ggf geänderten Daten, stoppe den Timer wenn das Flag gesetzt ist und lasse das Hauptprogramm weiter laufen:

Code:

main_GUI_handles=guidata(handle_to_main_GUI);%geänderte Daten laden
if main_GUI_handles.stop_timer %Flag prüfen
    stop(main_GUI_handles.read); %Timer stoppen
    uiresume; %Ausführung des Hauptprogramms fotfahren
end
 


Und Jetzt kommt das ABER:
Denn leider wird nicht wie von mir erst gedacht der Timer von der Callback unterbrochen. Stattdessen wird scheinbar mal eine Zeile von der Callback und mal eine vom Timer ausgeführt.
Dadurch kommt es hin und wieder vor, dass uiresume ausgeführt wird bevor uiwait ausgeführt wird. Folglich wartet die Callback vergeblich darauf weiter machen zu dürfen.

Funktionieren müsste es mit der wait funktion die ich ja aber leider wie oben erwähnt nicht nehmen kann.

Kann doch nichts so ungewöhnliches sein, dass man eine Funktion erst nach dem tatsächlichen Ende eines Timers weiter laufen lassen will?!? Oder stell ich mich einfach zu blöd an?
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.11.2011, 16:18     Titel:
  Antworten mit Zitat      
Hallo Joeh,

Das Programmieren nebenläufiger Prozesse ist nicht trivial. Man benötigt wirklich ausgefeilte Konzepte, um solchen Problemen zu entgehen.

Könntest Du im Button-Callback einen bestimmten Wert im GUI setzen, z.B. den STOP-Button auf 'Enable'='off' stellen (dann kann man ihn auch nicht zweimal drücken), und danach per UIWAIT darauf warten, dass ihn der TIMER wieder ändert, nachdem er fertig geworden ist?

Gruß, Jan
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: 16.11.2011, 16:07     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank für deinen super Tip! war in meinem Fall insgesammt zwar nicht so leicht umzusetzen wie erhofft. Und ich habe eine Ewigkeit gebraucht um herraus zu finden warum es trotzdem immer mal wieder hängen geblieben ist
(Lösung: ein drawnow Smile)

Aber jetzt läuft alles!

Joeh
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.