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

Callback unterbrechen bis Timerausführung beendet ist

 

Ede_123
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 18.05.11
Wohnort: ---
Version: R2011a
     Beitrag Verfasst am: 23.05.2011, 01:47     Titel: Callback unterbrechen bis Timerausführung beendet ist
  Antworten mit Zitat      
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:
Code:
function btn1_Callback(hObject, eventdata, handles)
    while(handles.timerFcnActive)
        pause(0.2);
    end
   
    increment(hObject,1);

Code:
function timer_Callback(obj, eventdata, hObject)
    handles = guidata(hObject);
    handles.timerFcnActive = true;
    guidata(hObject, handles);
   
    for I = 1:10
        pause(0.2);
        increment(hObject,2);
    end
   
    handles.timerFcnActive = false;
    guidata(hObject, handles);


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.

Example.m
 Beschreibung:

Download
 Dateiname:  Example.m
 Dateigröße:  4.63 KB
 Heruntergeladen:  339 mal
Example.fig
 Beschreibung:

Download
 Dateiname:  Example.fig
 Dateigröße:  1.9 KB
 Heruntergeladen:  283 mal
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: 23.05.2011, 12:11     Titel: Re: Callback unterbrechen bis Timerausführung beendet ist
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Ede_123
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 18.05.11
Wohnort: ---
Version: R2011a
     Beitrag Verfasst am: 23.05.2011, 13:29     Titel:
  Antworten mit Zitat      
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 Wink ) 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.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 23.05.2011, 13:54     Titel:
  Antworten mit Zitat      
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:

Example.m
 Beschreibung:

Download
 Dateiname:  Example.m
 Dateigröße:  4.66 KB
 Heruntergeladen:  312 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Ede_123
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 18.05.11
Wohnort: ---
Version: R2011a
     Beitrag Verfasst am: 23.05.2011, 19:48     Titel:
  Antworten mit Zitat      
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.
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.