|
|
Callback unterbrechen bis Timerausführung beendet ist |
|
Ede_123 |

Forum-Anfänger
|
 |
Beiträge: 10
|
 |
|
 |
Anmeldedatum: 18.05.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2011a
|
 |
|
|
 |
|
Verfasst am: 23.05.2011, 01:47
Titel: Callback unterbrechen bis Timerausführung beendet ist
|
 |
|
 |
|
Hi Leute,
ich bin am verzweifeln... Habe mittlerweile alles Mögliche ausprobiert und nichts hat bisher funktioniert.
Mein Problem ist, dass ich in einer GUI ein Callback einer GUI-Komponente verzögern möchte, bis ein Timer im Hintergrund seine Funktion abgearbeitet hat.
Grund ist, das im Callback der GUI-Komponente Daten verändert werden sollen, die wärend der Ausführung des Timer-Callbacks jedoch nicht verändert werden dürfen.
Da es schwierig zu erklären ist, habe ich Euch einfach kurz ein Beispiel-Programm geschrieben, das mein Problem verdeutlicht:
- Die GUI zeigt zwei Ziffern an.
- Der Timer-Callback zählt die zweite Ziffer periodisch von 0-9 durch
- Der Button inkrementiert die erste Ziffer
Es soll nun möglich sein, den Button zu drücken, während der Timer gerade durchzählt, allerdings soll der Button-Callback verzögert werden, bis der Timer-Callback abgeschlossen ist.
Im Moment hängt sich das Programm in diesem Moment jedoch sofort auf.
Hier die beiden Callback-Funktionen:
Das komplette Programm findet ihr als Anhang, ich hoffe ihr findet einen Weg um es so umzuschreiben, dass es sich nicht aufhängt, aber der Button-Callback dem Timer-Callback nicht dazwischenfunkt.
Beschreibung: |
|
 Download |
Dateiname: |
Example.m |
Dateigröße: |
4.63 KB |
Heruntergeladen: |
339 mal |
Beschreibung: |
|
 Download |
Dateiname: |
Example.fig |
Dateigröße: |
1.9 KB |
Heruntergeladen: |
283 mal |
|
|
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 23.05.2011, 12:11
Titel: Re: Callback unterbrechen bis Timerausführung beendet ist
|
 |
Hallo Ede_123,
"Das Programm hängt sich auf" ist keine genaue Beschreibung des Problems. Kannst Du posten, was genau passiert? Gibt es vielleicht eine Fehlermeldung? Welche?!
Das Timing von Callbacks ist eine fragile Sache. Da sowohl Timer als auch Callbacks auf eine DRAWNOW warten und sich so gegenseitig blockieren können, würde ich für die Stabilität empfehlen, nur einen von den beiden Mechanismen zu verwenden: Z.B. läuft der Timer durch und der Button verändert lediglich einen Wert, der vom Timer dann am Ende der Schleife abgefragt wird.
Gruß, Jan
|
|
|
Ede_123 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 10
|
 |
|
 |
Anmeldedatum: 18.05.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2011a
|
 |
|
|
 |
|
Verfasst am: 23.05.2011, 13:29
Titel:
|
 |
Hi Jan,
danke für deine Antwort!
Ich weiß das "hängt sich auf" eigentlich unzureichend ist, aber ich weiß ehrlich gesagt selbst nicht was in diesem Moment passiert.
Es gibt keine Fehlermeldung, aber auch sonst tut sich nichts mehr. Ich befürchte, dass hier das von dir beschriebene Problem eintritt: Der Button-Callback hängt in der Schleife fest und blockiert den Timer-Callback, der somit nie zum Ende kommt.
Das ist aber alles nur eine "naive" Vermutung von mir, ich hatte gehofft, dass ihr mir sagen könnt was genau schiefläuft. Deshalb hatte ich das lauffähige (oder eben nicht lauffähige ) Programm-Beispiel angehängt.
Falls sonst niemand eine Idde dazu hat, werde ich es wohl so machen wie Jan vorgeschlagen hat: Der Button-Callback schreibt lediglich die geänderte Variable in einen Zwischenspeicher, die notwendigen Berechnungen werden dann erst am Anfang/Ende des Timers ausgeführt.
|
|
|
denny |

Supporter
|
 |
Beiträge: 3.853
|
 |
|
 |
Anmeldedatum: 14.02.08
|
 |
|
 |
Wohnort: Ulm
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 23.05.2011, 13:54
Titel:
|
 |
Hallo
Im Prinzip ist Timer dazu da, um Schleife zu ersetzen,
bei dir wird stattdessen in TIMER FOR genutzt, dann ist der Effekt von Timer verpufft.
Also siehe in Anhang geänderte Version:
Beschreibung: |
|
 Download |
Dateiname: |
Example.m |
Dateigröße: |
4.66 KB |
Heruntergeladen: |
312 mal |
|
|
|
Ede_123 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 10
|
 |
|
 |
Anmeldedatum: 18.05.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2011a
|
 |
|
|
 |
|
Verfasst am: 23.05.2011, 19:48
Titel:
|
 |
|
 |
|
Hi Denny,
danke für deine Modifizierungen an meinem Quelltext. Konnte ich etwas davon lernen.
Leider ist das eigentliche Problem damit nicht gelöst:
Du hast in deinem Code die pause-Anweisung im Timer-Callback auskommentiert. Kommentiert man sie wieder ein (oder fügt ein drawnow, wait, etc. ein, also ein Schlüsselwort, welches MATLAB erlaubt Befehle der Event-Queue abzuarbeiten), ergeben sich ähnliche Deadlocks, wie schon in meinem Code-Beispiel.
Nochmal zur Erklärung: Die for-Schleife im Timer-Callback ergibt natürlich keinen Sinn. Sie soll lediglich ein beliebiges Code-Stück darstellen, welches einige Sekunden Zeit zur Abarbeitung in Anspruch nimmt und dabei nicht unterbrochen/gestört werden sollte.
P.S.: Ich habe mein Programm (Aufgabe im Prinzip: Daten von einem Messgerät einlesen und auswerten/plotten) inzwischen so umgeschrieben, dass alle Aufgaben in einer langen Schleife nacheinander abgearbeitet werden.
So umgehe ich zwar Timing-Probleme und Deadlocks, allerdings kann ich auch nicht schon mit der Datanauswertung beginnen, während die Funktion zum einlesen der Daten gerade auf das Messgerät wartet.
Dies hatte ich versucht mit der Timer-Konstellation von oben zu umgehen. Falls noch jemand eine Idee hat, würde ich mich nach wie vor darüber freuen.
|
|
|
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| 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.
|
|