Verfasst am: 21.12.2012, 06:20
Titel: Problem mit meinem cancel button
Hallo,
ich habe ein Problem mit dem waitbar cancel button. 2 Dinge schaff ich nicht.
- Ich schaff es nicht Matlab mit dem Cancel-Button zu unterbrechen. Matlab haengt danach.
- ich kann keine Werte uebergeben. Ich schaff es nicht den pushbutton1 wieder auf enable,"on" zu stellen
- mit delete(h) loesche ich nur den cancel Button. Ich moechte natuerlich die ganze waitbar schliessen.
Und hier hab ich ein Beispiel gemacht. In GUIDE habe ich einen Button (pushbutton1) erstellt und folgendes reingeschrieben:
Code:
function pushbutton1_Callback(hObject, eventdata, handles)
% nur damit was langes in dos gemacht wird
fid = fopen(strcat('test.cmd'),'wt');
fprintf(fid,'pause\n');
fprintf(fid,'exit\n');
fclose(fid);
% nur damit was langes in dos gemacht wird
h = waitbar(0,'first simulation...','CreateCancelBtn',@cancelcb);
rechnen(h)
function rechnen(h) [status, result] =system('test.cmd');
Verfasst am: 21.12.2012, 10:02
Titel: Re: Problem mit meinem cancel button
Hallo neuling123,
Der Cancel-Button ist zunächst nur ein Button. Der kann Matlab natürlich nicht unterbrechen.
Wieso ist die PAUSE in DOS kein Problem? Immerhin blockiert sie die Ausführung des Batch-Scripts auf unbestimmte Zeit und blockiert damit auch Matlab bis das Script wieder die Kontrolle zurückgibt. Eigentlich sieht es so aus, als gäbe es ausser diesem PAUSE-Befehl gar kein Problem und die WAITBAR ist nur ein optisches Gimick.
Du hast gar nicht den Code gepostet, mit dem Du versuchst den pushbutton1 wieder auf 'Enable'='on' zu setzen. Deshalb sieht es so aus, als könne das auch gar nicht funktionieren.
Im Callback des Cancel-Buttons wird der Handle dieses Buttons übergeben. Der erste Parameter aller Callbacks ist das aufrufende Objekt. Mit "delete(h)" wird dann wie beobachtet dieser Button gelöscht. Wenn Du die FIGURE löschen möchtest, musst Du dies angeben, z.B. indem Du ihren Handle per "ancestor(h, 'figure')" erhälst.
Wenn aber die WAITBAR gelöscht ist, wird dies immer noch keine Auswirkungen auf den Programmablauf haben.
Bitte erkläre nochmal genau: Was möchtest Du erreichen, z.B. welche Funktion soll genau wodurch unterbrochen werden?
Den Ablauf eines DOS-Batch-Scripts kannst Du von Matlab aus nur über ziemlich komplizierte Umwege beeinflussen, und das ist auch gewollt.
Hallo Jan,
danke fuer deine Hilfe. Nochmals zu meinen Problem und meinem Ziel.
Mein Problem ist, dass ich einen DOS Befehl laufen habe (es sind eigentlich 900 in Margen zu 16 per Schleife), der lange (15min) dauert. Manchmal merke ich, das ich was lalsch gemacht habe und moechte den Ablauf in Matlab (der ja beim system Befehl haengt bis der dos befehl zuende ist) einfach unterbrechen um ganz einfach nochmal den pushbutton 1 zu druecken. Also einfach Matlab unterbrechen um es nochmal neu zu starten. Normalerweise muss ich immer Ctrl/c in matlab command window druecken und alle laufenden dos tasks mit der Hand killen.
Nur zur Info: um die DOS Anweisung zu killen habe ich eine system anweisung die das machen wuerde. Wobei meine cancel function eigentlich so aussieht:
Code:
function cancelcb(h,a2) dos('taskkill /f /FI "IMAGENAME eq runsim.exe"') ; % das funktioniert super delete(h)% hier loescht er den cancel button anstatt des waitbar Fensters % und dann haengt matlab und muss oft neu gestartet werden
P.S.: frueher hatte ich nur eine waitbar. Wenn ich den Programmaublauf stoppen wollte, habe ich die waitbar einfach geloescht (rechts oben mit dm windows Kreuz). Dann hat es 10min gedauert bis er wieder in der Schleife an der waitbar vorbeigekommen ist und mit dem Fehler der fehlenden waitbar das Programm stoppte. 10min
Es ist ja nicht Matlab, das hängt, sondern das in DOS laufende Programm. Deshalb brauchst Du nicht Matlab zu unterbrechen, sondern das externe Programm.
Ich verstehe nicht, ob Dein TASKKILL-Aufruf nun funktioniert oder nicht. "das funktioniert super" und "und dann haengt matlab" scheint sich zu widersprechen.
Wenn Du statt des Buttons die FIGURE löschen möchtest, die ihn beinhaltet:
Ich habe nebenbei gesagt keine Ahnung was "900 in Margen zu 16 per Schleife" sein könnten.
Ich vermute, ein anderer Ansatz ist notwendig: Statt das externe Programm blockieren aufzurufen, wäre ein asynchroner Aufruf mit "system('Command &')" sinnvoll. Dann wäre der TASKKILL-Befehl ohne Schwierigkeiten durchführbar. Allerdings bliebe dann das Problem zu erkennen, wann das externe Programm fertig ist.
Interprozess-Kommunikation ist immer schwierig und anfällig für Fehler. Die beste Methode ist meistens die Notwendigkeit dazu zu vermeiden.
Gruß, Jan
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.