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

Tastatur-Eingabe auslesen

 

robertradar
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 17.10.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.02.2017, 17:57     Titel: Tastatur-Eingabe auslesen
  Antworten mit Zitat      
Guten Tag,

ich möchte folgendes: Wird beim ausgewählten Plot eine Taste gedrückt, so soll ihr zugehöriger Wert in einer Workspace-Variable landen.

Ich habe das bereits so gelöst:

Code:
Code
global KEY_IS_PRESSED
global KEY_VALUE
h_fig = figure;
set(h_fig, 'KeyPressFcn', @key_pressed)

function key_pressed(hObject, event)

    global KEY_IS_PRESSED
    global KEY_VALUE
   
    KEY_IS_PRESSED  = true;
    KEY_VALUE = event.Key;

end
 


Gibt es eine Möglichkeit, das ganze ohne Verwendung globaler Variablen zu erreichen? Hierfür müsste mein function handle einen Rückgabewert habe, aber ich weiß leider nicht wie ich diesen Rückgabewert in meinen Workspace transferiere.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.02.2017, 10:10     Titel:
  Antworten mit Zitat      
Hallo,

du kannst application data verwenden, z.B.
Code:
setappdata(hObject, 'KEY_VALUE', KEYVALUE)


Dann kannst du dir mit getappdata die Information wieder holen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
robertradar
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 17.10.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.02.2017, 23:52     Titel:
  Antworten mit Zitat      
Das funktioniert so weit, aber leider nicht innerhalb von spmd:

Code:

A=10;
B=5;

h_fig = figure('Renderer','OpenGL');
set(h_fig, 'KeyPressFcn', @key_pressed) %"Interrupt"-Routine
KEY_IS_PRESSED = false;
KEY_VALUE = 0;
setappdata(h_fig,'KEY_VALUE',KEY_VALUE);
setappdata(h_fig,'KEY_IS_PRESSED',KEY_IS_PRESSED);
drawnow


spmd(2)
    Weiter = false;
    Zahl = 10;
    switch labindex
        case 1
            Hallo = A+B;
            a=A;
            pause(5);
            Weiter = true;
            labSend(Weiter,2,1)      
        case 2          
            b=B;
            while 1
                Weiter = labReceive(1,1);
                if Weiter
                    disp('Funktioniert!')
                    break
                end
            end            
            while 1                
                KEY_VALUE = getappdata(h_fig,'KEY_VALUE');
                KEY_IS_PRESSED = getappdata(h_fig,'KEY_IS_PRESSED');
                if KEY_IS_PRESSED
                    switch KEY_VALUE
                        case '1'
                            1
                            xlabel('1')
                        case '2'
                            2
                            xlabel('2')
                        case 'Esc'
                            break
                    end
                    drawnow
                    KEY_IS_PRESSED = false;
                    setappdata(h_fig,'KEY_IS_PRESSED',KEY_IS_PRESSED);
                end
            end            
    end  
end

function key_pressed(hObject, event)

%% Variante globale Variablen

%     global KEY_IS_PRESSED
%     global KEY_VALUE
%    
%     KEY_IS_PRESSED  = true;
%     KEY_VALUE = event.Key;

% KEY_VALUE = event.Key;
% KEY_IS_PRESSED = true;

%% Variante setappdata und getappdata

KEY_VALUE = event.Key;
KEY_IS_PRESSED = true;
setappdata(hObject,'KEY_VALUE',KEY_VALUE);
setappdata(hObject,'KEY_IS_PRESSED',KEY_IS_PRESSED);

end
 


Liegt das an mir oder an Matlab? Bei letzterem: Wie erreiche ich ein Tastatur-Wert-Auslesen innerhalb von spmd?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.02.2017, 00:53     Titel:
  Antworten mit Zitat      
Hallo,

und was passiert, wenn du es so versuchst?
Bekommst du eine Fehlermeldung? Welche?

Der Code innerhalb von spmd läuft auf anderen MATLAB-Prozessen, die evtl. sogar auf einem anderen Rechner laufen. Da ist es zu erwarten, dass sie nicht gegenseitig die internen Daten kennen.

Was versuchst du denn mit diesem Konstrukt zu erreichen?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
robertradar
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 17.10.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.02.2017, 16:57     Titel:
  Antworten mit Zitat      
Es kommt weder zu einer Fehlermeldung noch zu dem, was ich dachte programmiert zu haben. Bspw. müsste das Programm doch zum Ende kommen, wenn ich Escape drücke?!

In der Doku habe ich dazu bislang nichts finden können.


Ich habe eine Anwendung, deren Ergebnis kontinuierliche Plots sind. Dabei soll der Bediener bestimmte Eingaben vornehmen können, um die Art der Plots zu beeinflussen.
Das Ganze funktioniert als serieller Code einwandfrei. Um die Laufzeit eventuell zu reduzieren, strebe ich nun parallelen Code an.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.02.2017, 20:56     Titel:
  Antworten mit Zitat      
Hallo,

verwundert mich eigentlich, dass es nicht zu einer Fehlermeldung kommt.

Eine Idee wäre, die while-Schleife und die Abfrage der Benutzereingabe außerhalb von spmd zu machen und nur Berechnungen etc. in der Schleife.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
robertradar
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 17.10.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.02.2017, 22:25     Titel:
  Antworten mit Zitat      
Hi Harald,

du kannst den Code 1:1 ausprobieren, es erscheint keine Fehlermeldung.

Ich hatte anfangs auch mit globalen Variablen experimentiert und erstaunt festgestellt, dass sich deren Wert zwar in Abhängigkeit der Tastatur Bedienung wie gewünscht geändert hatte, jedoch nicht das Lesen des aktuellen Werter innerhalb von spmd.

Ich bin eben auf folgendes gestoßen:
https://de.mathworks.com/help/distc.....n-multiple-data-sets.html
Dort heißt es "The body of an spmd statement cannot contain break or return statements.". Was genau ist denn der body? Alles zwischen spmd und zugehörigem end?


Deine vorgeschlagene Alternative scheidet für meine Anwendung leider aus, da ich aus Zeitgründen spmd nur ein einziges Mal ausführen möchte (und dann bis zum Ende dort drin bleiben will), da das Initiieren sehr viel Zeit kostet.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.02.2017, 22:34     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
du kannst den Code 1:1 ausprobieren, es erscheint keine Fehlermeldung.

Das glaube ich dir gerne, es hat mich lediglich verwundert, dass dem so ist.

Zitat:
Ich hatte anfangs auch mit globalen Variablen experimentiert und erstaunt festgestellt, dass sich deren Wert zwar in Abhängigkeit der Tastatur Bedienung wie gewünscht geändert hatte, jedoch nicht das Lesen des aktuellen Werter innerhalb von spmd.

Erklärung dafür siehe 11.2., 23:53.

Zitat:
Was genau ist denn der body? Alles zwischen spmd und zugehörigem end?

Ja.

Zitat:
Deine vorgeschlagene Alternative scheidet für meine Anwendung leider aus, da ich aus Zeitgründen spmd nur ein einziges Mal ausführen möchte (und dann bis zum Ende dort drin bleiben will),

Nur ist das aus den genannten Gründen eben nicht möglich. Die Eingabe erfolgt in einem Prozess, die Verwendung in einem anderen, und damit ist auch eine Kommunikation nötig.

Zitat:
da das Initiieren sehr viel Zeit kostet.

"sehr viel" ist relativ ;) Beim momentanen Code natürlich, weil da ja nichts zeitaufwändiges gemacht wird.

Je nach Code können Vektorisierung, Generieren von MEX-Files, oder bei wiederholt überschriebenen Graphen das Ersetzen der Daten statt die Neuerstellung der Graphik Alternativen sein.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
robertradar
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 17.10.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.02.2017, 22:49     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:

Zitat:
Was genau ist denn der body? Alles zwischen spmd und zugehörigem end?

Ja.

Das wundert mich, denn ich habe sogar 2x break. Von der Geschichte mit der Tastatur abgesehen funktioniert es auch genau so, wie ich es mir wünsche.

Zitat:

Zitat:
Deine vorgeschlagene Alternative scheidet für meine Anwendung leider aus, da ich aus Zeitgründen spmd nur ein einziges Mal ausführen möchte (und dann bis zum Ende dort drin bleiben will),

Nur ist das aus den genannten Gründen eben nicht möglich. Die Eingabe erfolgt in einem Prozess, die Verwendung in einem anderen, und damit ist auch eine Kommunikation nötig.

Das leuchtet ein. Dann muss es doch aber irgendwie möglich sein, die Daten entsprechend zu transportieren. Vielleicht würde es einen Unterschied machen, die Figur innerhalb des Workers zu definieren?

Zitat:

Zitat:
da das Initiieren sehr viel Zeit kostet.

"sehr viel" ist relativ Wink Beim momentanen Code natürlich, weil da ja nichts zeitaufwändiges gemacht wird.

Je nach Code können Vektorisierung, Generieren von MEX-Files, oder bei wiederholt überschriebenen Graphen das Ersetzen der Daten statt die Neuerstellung der Graphik Alternativen sein.

Grüße,
Harald

Ich bin mir ziemlich sicher, dass ich dahingehend keine nennenswerten Reserven mehr habe. Das mit der Parallelisierung reizt mich.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.02.2017, 11:16     Titel:
  Antworten mit Zitat      
Hallo,

neben wiederholten spmd - Blöcken sehe ich zwei Möglichkeiten:
a) pmode mit client2lab
b) Daten in Dateien schreiben und aus diesen holen

Ob das hinsichtlich Performance besser ist, müsste man ausprobieren.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
robertradar
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 17.10.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.02.2017, 13:42     Titel:
  Antworten mit Zitat      
Ich habe eben in der Doku gelesen, dass innerhalb von spmd kein grafischer Output möglich ist. Befehle wie figure etc. erzeugen also keine Wirkung.
(Es wundert mich gleichzeitig, dass der Compiler da nichts anmerkt.)

Damit erübrigen sich weitere Anstrengungen. Schade.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.02.2017, 13:49     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ich habe eben in der Doku gelesen, dass innerhalb von spmd kein grafischer Output möglich ist. Befehle wie figure etc. erzeugen also keine Wirkung.

Das ist naheliegend, da die Figure ja im Worker-Prozess lebt und dieser kein Display hat.

Bleiben die Vorschläge von 12.2., 21:34, sofern sie nicht ohnehin schon umgesetzt sind.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
robertradar
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 17.10.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.02.2017, 13:57     Titel:
  Antworten mit Zitat      
So naheliegend empfand ich dies nicht, da schließlich auch der Command Window des Client benutzt wird.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.02.2017, 14:35     Titel:
  Antworten mit Zitat      
Hallo,

für die Anzeige werden die Daten von den Workern zum Client geschickt.

Sieht man schön mit den ticBytes / tocBytes - Funktionen, die es seit R2016b gibt.

Code:
ticBytes(gcp);
parfor I = 1:10
    x = rand(1000,1);
    disp(x)
    pause(0.1)
end
tocBytes(gcp)

Dann mal die disp-Zeile auskommentieren und nochmal laufen lassen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
robertradar
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 17.10.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.02.2017, 15:19     Titel:
  Antworten mit Zitat      
Aber wieso hat man diesen Vorgang nicht auch für drawnow etc. installiert?
(Wobei ich mich da auch wieder frage, wie lange dieses hin und her schicken, auch von einem Worker zum anderen, dauert.)
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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