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

Unterbrechen der m-file-Berechnung mit pushbutton

 

Holla84
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 18.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.07.2010, 10:01     Titel: Unterbrechen der m-file-Berechnung mit pushbutton
  Antworten mit Zitat      
Guten Tag,

würde gerne über eine GUI die Berechnung meines M-file per pushbutton unterbrechen und oder pausieren lassen.

Hab komischerweise noch nicht den richtigen Befehl gefunden, ihr könnt mir sicherlich helfen.
Private Nachricht senden Benutzer-Profile anzeigen


josekamara
Forum-Meister

Forum-Meister


Beiträge: 529
Anmeldedatum: 26.04.08
Wohnort: München
Version: ---
     Beitrag Verfasst am: 12.07.2010, 10:37     Titel:
  Antworten mit Zitat      
Mit
Code:

würde es gehen.
_________________

Simulation
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: 12.07.2010, 10:38     Titel:
  Antworten mit Zitat      
Hallo Holla,

ein Fall für die FAQs.
Du kannst eine Figure mit einem Button öffnen und per Callback irgendwo irgendeinen Flag setzen, den Dein M-File regelmäßig (aber nicht zu oft) abfragen muss. Um die Events bearbeiten zu lassen, braucht Dein M-File noch ein DRAWNOW. Bsp:
Code:
FigH = figure;
ButtonH = uicontrol('Style', 'PushButton', 'String', 'Stop', ...
    'Callback', 'close(gcbf);');
...
% Dann dem M-File den Figure-Handle übergeben:
function BerechneMitStop(Input1, Input2,  FigH)
for i = 1:1e6
  if rem(i, 100) == 0
    drawnow;
    if not(ishandle(FigH))
       return;
    end
  end
  <Hier die Berechnungen>
end

Statt die Existenz der Figure abzufragen, kannst Du auch per "SETAPPDATA(0, 'UserRequestedStopping', 1)", "set(FigH, 'UserData', 1)", das setzen einer globalen Variable, etc. dem M-File mitteilen, dass es stoppen soll.
Im FileExchange auf der Matlab-Seite findest Du ein paar Progressbars mit Stop-Button, bei denen Du den Callback frei definieren kannst.

Viel Erfolg, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Holla84
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 18.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.07.2010, 08:43     Titel:
  Antworten mit Zitat      
Mit
Code:
klappt es schon aber dann ist die Berechnung ja nur unterbrochen und nicht gestoppt. Aus dem keyboardmodus komm ich dann auch nur raus wenn ich mit
Code:
zurück zur Berechnung gehe.

Es muss doch einen Befehl geben der es ermöglicht die Berechnung einfach zu stoppen.

Mit
Code:
klappt es nur in Schleifen.

Code:
schließt direkt MATLAB

und mit
Code:
wird ja auch nichts gstoppt.

Es soll einfach das Mfile gestoppt werden und der Use wird zurück ins Commandwindow versetzt. Sollte eigentlich nicht soo schwer sein, wahrscheinlich mal wieder ein einfacher Befehl Very Happy [/code]
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 14.07.2010, 09:42     Titel:
  Antworten mit Zitat      
Hallo

Die Tastenkombination Strg+C bricht die Berechnung in der Script ab. Der Fokus muss aber auf Matlab Konsole befinden, damit es funktioniert.
Private Nachricht senden Benutzer-Profile anzeigen
 
Holla84
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 18.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.07.2010, 10:11     Titel:
  Antworten mit Zitat      
Das weiß ich wohl, möchte aber gerne die Möglichkeit schaffen, dass User die im Umgang mit MATLAB nicht so firm sind einfach einen Button drücken um die Berechnung zu stoppen. Trotzdem Danke
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 14.07.2010, 11:00     Titel:
  Antworten mit Zitat      
Also es gibt keinen speziellen Befehl, der einfach einen Script auf beliebigen Stelle unterbricht.

Vielleicht ist es über Timer realisierbar, obwohl das sind auch Zyklen
und du hast ja kein Zyklus, sondern willst beliebige Berechnung einfach abbrechen.
Listener wäre hier wohl die Lösung, da aber Matlab keine Listener hat, denke dass ist mit Matlab Mitteln unmöglich.
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: 14.07.2010, 22:30     Titel:
  Antworten mit Zitat      
Hallo Denny,

man kann schon einiges in Matlab programmieren, was einem Listener entspricht. Der "event.listener" z.B.
Das Problem ist eher, dass man einen laufenden Thread (hier mit den Berechnungen) nicht ohne weiteres stoppen kann. Das erlaubt schon das Betriebssystem nicht!

Deshalb ist es notwendig, längere Berechnungen in kleiner Häppchen aufzuteilen, so dass man am Ende eines Blocks bequem irgendeinen Flag abfragen kann, wie in meinem Code-Beispiel bereits erwähnt.

Wenn man nach KEYBOARD einen Programmteil verlassen möchte, empfiehlt sich noch ERROR. Wenn man den Code-Teil in einen TRY-CATCH Block eingekapselt hat, kann man dort im CATCH Teil noch eine genauere Fehler-Behandlung ausführen oder das Programm ohne Meldungen verlassen.

Gruss Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Holla84
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 18.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.07.2010, 08:42     Titel:
  Antworten mit Zitat      
Wundert mich ehrlich gesagt ein bisschen das es dafür keinen Befehl gibt.

Habe es jetzt etwas unelegant mit

Code:


so findet das Programm die handles nicht mehr und bricht ab. Naja nicht schön aber selten.... Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 15.07.2010, 08:47     Titel:
  Antworten mit Zitat      
Hallo Jan,

stimmt, da habe ich Listener Einführung verschlafen, nicht desto trotz
Funktionsweise ist in Vergleich zu JAVA ist doch ziemlich eingeschränkt.
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: 15.07.2010, 09:01     Titel:
  Antworten mit Zitat      
Hallo Denny,

nun sind ja inzwischen alle Grafik-Objekt in Matlab in Java implementiert, so dass man leicht echte Java-Event-Listener anhängen kann.
Der bisher merkwürdigste Wunsch eines Users war ein Listener, der aktiviert wird, wenn ein Benutzer das Editor-Fenster aktiviert:
Code:
% Needs Matlab 7!
  desktop = com.mathworks.mde.desk.MLDesktop.getInstance;
  jEditor = desktop.getGroupContainer('Editor').getTopLevelAncestor;
  set(jEditor, 'WindowGainFocusCallback', 'disp(''Editor activated'')');
 

Schräg war auch die Frage, wie man den Tasten-Druck Listener für das CommandWindow umbiegt, so dass statt der gedrückten Taste ein andere Buchstabe erscheint. Wie nüztlich :-)
Den Code poste ich mal nicht, weil man im Notfall seine Matlab-Session nicht mehr richtig schließen kann. Das wäre dann ein "bitte starten sie diese Mal-ware von Hand"-Virus...

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 15.07.2010, 22:25     Titel:
  Antworten mit Zitat      
Hallo Jan

Ja, das weiß ich , dass Graphik-Objekte bei Matlab in Java implementiert sind.
Für mich ist der Weg noch viel zu komplex und nicht immer nachvollziehbar. Aber ich muss mich vielleicht einfach wieder mit Java beschäftigen. Ich bin in letzten 5 Jahren nur mit Matlab gearbeitet. Dass ist Menge Zeit vergangen wo ich letztes Mal mit Java gearbeitet habe.

Man kann zwar Java auf diese Objekte mit Java zugreifen, man kann aber nie sicher sein, dass es in nächster Version noch funktioniert.

Apropos in R2010b kommt schon die Warnung,
Zitat:

Warning: Possible deprecated use of set on a Java callback.

Code:

% in R2010b Callback hat sich verändert
set(jEditor, 'WindowGainedFocusCallback', 'disp(''Editor activated'')');
 
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: 15.07.2010, 23:54     Titel:
  Antworten mit Zitat      
Hallo Denny,

Zitat:
Für mich ist der Weg noch viel zu komplex und nicht immer nachvollziehbar.
...
Man kann zwar Java auf diese Objekte mit Java zugreifen, man kann aber nie sicher sein, dass es in nächster Version noch funktioniert.


Da hast Du allerdings recht. Man kann sich nicht mal sicher sein, ob es mit der jetzigen Version klappt, falls man ein automatisches Update des JRE runterlädt. Es gab mal Probleme mit weißer Schrift auf weißem Grund in allen Matlab-Fenstern unter MacOS-X nach einem Java-Update.

Einen Callback from "WindowGainFocus" auf "WindowGainedFocus" umzubenennen finde ich herzhaft geckig, da es ohne Mehrwert die Benutzbarkeit einschränkt. Deswegen schlage ich vor:
"Es gibt keine benutzerfreundliche und versions-sichere Listener in Matlab."

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.07.2010, 07:59     Titel:
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:
Hallo Denny,
Deswegen schlage ich vor:
"Es gibt keine benutzerfreundliche und versions-sichere Listener in Matlab."

Gruß, Jan


Very Happy Da bin ich mit dir voll einverstanden
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.