LabVIEWForum.de
Wo werden Tasteneingaben gepuffert?? - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Wo werden Tasteneingaben gepuffert?? (/Thread-Wo-werden-Tasteneingaben-gepuffert)

Seiten: 1 2


Wo werden Tasteneingaben gepuffert?? - labruss - 26.07.2008 11:49

Hallo zusammen:
Weiß jemand wo Tasteneingaben gepuffert werden? Ich benutze sie in Eventcases.
Und was noch wichtiger ist: Kann man diesen Puffer löschen/leeren??

gruß labruss


Wo werden Tasteneingaben gepuffert?? - IchSelbst - 27.07.2008 13:21

' schrieb:Weiß jemand wo Tasteneingaben gepuffert werden?
Wenn der Anwender eine Eingabe macht (z.B. Maus oder Tastatur) versendet Windows an die zum Eingabezeitpunkt aktive Applikation (eigentlich an die, die gerade den Tastatur/Maus-Fokus hat) eine Message. Diese Message enthält unter anderem den Wert der Eingabe. Die Message geht zuerst an die Applikation als solche und die verteilt die Messages dann an ihre Eingabeelemente etc.

Es gibt eigentlich keinen Puffer für die eingegebenen Zeichen, sondern nur eine Warteschlange für alle Messages. Ein Eingabeelement holt sich die Tastatureingaben also nicht ab, sondern bekommt sie unaufgefordert zugeschickt.

Für Tastatureingaben gibt es aber spezielle Messages wie z.B. OnKeyDown, OnKeyUp, OnKeyPressed etc. Die Massages kann man abfangen und manipulieren. Z.B. im Eventcase "Application.Taste..." oder im entsprechenden Case "MyInpField.Taste..." eines beliebigen Eingabefelder MyInpField.


Zitat:Und was noch wichtiger ist: Kann man diesen Puffer löschen/leeren??
Ich sehe zwei Möglichkeiten, Tasten zu ignorieren.
Entweder in "Application.Taste..." abfangen und löschen (ScanCode=0; VK_Value=0; etc) oder nach dem Fokusieren eines Eingabefeldes das Eingabefeld löschen.

Warum willst du den Tastaurpuffer denn überhaupt löschen?

Hinweis:
Manchmal sieht das Nicht-Bearbeiten der Messagequeue aus wie ein Tastaturpuffer. Dann sollte aber eher die Messagequeue bearbeitet werde, als der Tastaturpuffer gelöscht.


Wo werden Tasteneingaben gepuffert?? - labruss - 30.07.2008 07:56

Das gefällt mir ja schonmal nicht sehr gut das man nicht einfach einen "Puffer" leeren kann.

Warum ich Tasteneingaben verwerfen will...?!
Es tritt folgendes Verhalten auf:
Ich hab an 3 Stellen in meinem Programm einen Eventcase im "Keydown-Modus"...Nun gibt es zwei Probleme:

Erstens, wenn man mehrmals auf eine Taste drückt wird die Aktion auch mehrmals ausgeführt , z.B. Taste für Messung starten...die Messung läuft dann und wenn ich aus Versehen 2mal grdrückt habe dann starten es die Messung nach Beendigung der ersten Messung direkt neu.
Hier wäre als ein "Pufferlöschen" am Ende der Aktion nützlich!

Zweitens:
Wenn ich an dem einen Eventcase eine Taste (oder mehrere) drücke,dann werden diese ganz normal abgearbeitet. Wenn ich danach direkt an einer anderen Programmstelle an ein Eventcase komme, dann werden alle die Tasten auch dort nochmal "eingelesen"...
Das ist normalerweise keine Problem, weil die Tasten meist andere sind und damit in diesem Case kein Event auslösen, aber wenn man nun etwas schreibt, oder nur aus Versehen auf eine Taste kommt die nunmal in einem anderen Case ein Event auslöst dann hat man ein Problem.

Somit wäre mein Programm auch nicht für eine Anwendung geeignet...

Was genau ist denn die Eventoption: "Key down ?" im Gegensatz zu "Key down"...??? Hab gehört das man damit Sachen verwerfen kann...
Ebenso kann man doch auch zwischen Funktions- und "normalen" Ascii-Tasten unterscheiden oder ??
Hat jemand eine Idee was man gegen das Problem beim Mehrfachdrücken machen kann??

Danke schonma...

Labruss


Wo werden Tasteneingaben gepuffert?? - jg - 30.07.2008 08:20

' schrieb:...
Ich hab an 3 Stellen in meinem Programm einen Eventcase im "Keydown-Modus"...Nun gibt es zwei Probleme:

Erstens, wenn man mehrmals auf eine Taste drückt wird die Aktion auch mehrmals ausgeführt , z.B. Taste für Messung starten...die Messung läuft dann und wenn ich aus Versehen 2mal grdrückt habe dann starten es die Messung nach Beendigung der ersten Messung direkt neu.
Hier wäre als ein "Pufferlöschen" am Ende der Aktion nützlich!

Zweitens:
Wenn ich an dem einen Eventcase eine Taste (oder mehrere) drücke,dann werden diese ganz normal abgearbeitet. Wenn ich danach direkt an einer anderen Programmstelle an ein Eventcase komme, dann werden alle die Tasten auch dort nochmal "eingelesen"...
...
1. Verstehe ich richtig, du hast innerhalb eines VIs (am besten noch innerhalb einer While-Schleife) mehrere Event-Strukturen verwendet?? Das sollte man unbedingt vermeiden! Führt in der Regel (so wie bei dir) nur zu Ärger. Lies dir mal die Hinweise in der LV-Hilfe zur Verwendung der Event-Struktur durch!

2. Zu deinem ersten Problem, dann brauchst du halt noch zusätzliche Überprüfungen, z.B. trotz Event wird eine Messung nicht gestartet, da noch nicht genug Zeit seit Ende der letzten Messung vergangen ist, oder, oder, oder, ...

MfG, Jens


Wo werden Tasteneingaben gepuffert?? - IchSelbst - 30.07.2008 08:34

' schrieb:Erstens, wenn man mehrmals auf eine Taste drückt wird die Aktion auch mehrmals ausgeführt , z.B. Taste für Messung starten...die Messung läuft dann und wenn ich aus Versehen 2mal grdrückt habe dann starten es die Messung nach Beendigung der ersten Messung direkt neu.
Hier wäre als ein "Pufferlöschen" am Ende der Aktion nützlich!
Die Taste, die du hier ein zweites Mal gedrückt hast, wird nicht im Tastaturpuffer zwischengespeichert, sondern z.B. (es gibt hier mehrere Möglichkeiten) in der Eingangsqueue einer Event-Struktur - also innerhalb LV.
Eine Möglichkeit um das mit dem "Puffer" zu vermeiden kann folgende sein: Nimm eine Queue um den Startbefehl vom Event zur Messung zu führen. Am Ende der Messung löscht du die Queue. Dadurch wird quasi ein "Puffer-Löschen" simuliert.

Zitat:Wenn ich an dem einen Eventcase eine Taste (oder mehrere) drücke,dann werden diese ganz normal abgearbeitet. Wenn ich danach direkt an einer anderen Programmstelle an ein Eventcase komme, dann werden alle die Tasten auch dort nochmal "eingelesen"...
Zwei Methoden für ein Event? Das gibt nur Ärger! Lieber nur ein Event-Case mit Queue!

Zitat:Das ist normalerweise keine Problem, weil die Tasten meist andere sind und damit in diesem Case kein Event auslösen, aber wenn man nun etwas schreibt, oder nur aus Versehen auf eine Taste kommt die nunmal in einem anderen Case ein Event auslöst dann hat man ein Problem.
Richtig.
Gegen mehrere Event-Cases bin ich ja nicht unbedingt. Allerdings dagegen, dass ein Ereignis in mehreren Cases abgefragt werden kann.


Zitat:Was genau ist denn die Eventoption: "Key down ?" im Gegensatz zu "Key down"...???
Da müsste ich erst selbst nachsehen (was unter Tage (?) aber wie immer nicht geht): Bei ersterem kann überprüft werden, ob es sich überhaupt um einen KeyDown handelt, zweiterer ist tatsächlich ein KeyDown.

Zitat:Hab gehört das man damit Sachen verwerfen kann...
Ja. z.B. ScanCode=0 oder VK_Value=0

Zitat:Ebenso kann man doch auch zwischen Funktions- und "normalen" Ascii-Tasten unterscheiden oder ??
Ja. VK_Code abfragen etc.

Zitat:Hat jemand eine Idee was man gegen das Problem beim Mehrfachdrücken machen kann??
Tasten disables, Queue verwenden (= Puffer selber machen) etc.


Wo werden Tasteneingaben gepuffert?? - labruss - 31.07.2008 07:57

Kann man einen Tastendruck auch disablen??? Dachte das geht nur bei Buttons etc.

labruss


Wo werden Tasteneingaben gepuffert?? - labruss - 31.07.2008 08:57

UNd wie kann ich einen Befehl vor der Abarbeitung abfangen??
Zudem ist das ja problematisch weil während ich eine Messung mache bin ich ja innerhalt einer While-Schleife...und in dieser Zeit kann ich ja keine anderen anderen BEfehle ausführen...

labruss


Wo werden Tasteneingaben gepuffert?? - Achim - 31.07.2008 10:28

' schrieb:UNd wie kann ich einen Befehl vor der Abarbeitung abfangen??
Rtmfx
[attachment=13752]


Zitat:Zudem ist das ja problematisch weil während ich eine Messung mache bin ich ja innerhalt einer While-Schleife...und in dieser Zeit kann ich ja keine anderen anderen BEfehle ausführen...
Wie so oft lautet das Stichwort "State machine". Damit kannst du genau solche Fälle vermeiden: Du hast nicht eine While-Schleife für eine spezifische Sache (z.B. Messung), sondern eine While-Schleife, die eine Case-Struktur immer wieder aufruft. Einer dieser Cases heißt dann z.B. "Messen" und wird immer wieder durchgeführt. Auf diese Weise hängst du nicht in der Messung selber fest, sonder kannst diese Messung von außen auch stoppen bzw. in der umgebenden While-Schleife (evtl. mitttels Event-Struktur) Eingaben machen. Noch besser wäre eine Producer-Consumer-Struktur, d.h. eine State machine in einer While-Schleife (alles zusammen = "Consumer") und eine parallele While-Schleife, in der deine Eingaben (Events) angenommen werden (= Producer). Die Befehle werden dann vom Producer z.B. per Notifier oder Queue an den Consumer übertragen. Es gibt dazu genügend Beispiele im LVF oder in der LV-Hilfe.

Und nochmals der dringende Hinweis: NUR EINE EVENTSTRUKTUR PRO BLOCKDIAGRAMM!

Gruß
Achim


Wo werden Tasteneingaben gepuffert?? - labruss - 31.07.2008 11:52

Also...
Vom Prinzip ist mein Programm auch aufgebaut wie eine state machine. Aber wie soll das funktionieren das man eine MEssung durchführt und trotzdem von außerhalb die Messung stoppt, denn die Messung soll ja laufen so lange ich will (und bin glaub noch nciht so stark in LV das ich paralle Schleifen laufen lassen kann)... Ich stoppe die Messung durch manuelles Betätigen eines Buttons auf dem FP (oder durch Tastendruck). Ich will ja auch nicht andauernd messen.

Im Moment habe ich zwar pro "Messart" 2 Eventcases, aber die werde ich jetzt zu einem machen. Aber wenn ich insgesamt im Programm 3 Eventcases hab (einen pro MEssart), jedoch immer nur einer verwendet wird pro Programmaufruf, dann dürfen die sich doch nicht stören.

Noch besser wäre jedoch wenn ich wüsste wie man einzelne Tasten "disabled"?! Das würde all meine Probleme glaub lösen, wenns diese Option überhaupt gibt!!
Mein Programm ist nämlich eigentlich schon fertig und das wär vorerst die einfachste Methode wie ich dieses Problem in Griff bekomm ohne mein komlettes Programm auf den Kopf zu stellen...

labruss


Wo werden Tasteneingaben gepuffert?? - Achim - 31.07.2008 12:34

Hi,
du kannst ja Buttons mit dem Property "Disabled"= 2 in den Zustand "Disabled and greyed out" versetzen...dann kann man sie nicht mehr betätigen und das Event "Value Changed" kann nicht mehr auftreten. Allerdings wird trotzdem das Event "Mouse down" detektiert und gepuffert und dann irgendwann nachträglich ausgeführt. Aus diesem Grund sollte ein Buttonevent immer mit ValueChange erfasst werden.

Wie oben schon mal beschrieben:
Bei Tastatureingaben kannst du mit "Key Down ?" (das ist ein Filterevent) abfragen, welche Taste betätigt wurde und diese dann gegebenenfalls verwerfen ("Discard" = TRUE). Ob du sie verwerfen willst, musst du dir irgendwie festlegen...z.B. wenn bei einem vorherigen Event mal in einer Booleschen Varible "Messung 1 aktiv" = TRUE gespeichert wurde und diese Variable dann im neuen Event abgefragt wird...

Zitat:Im Moment habe ich zwar pro "Messart" 2 Eventcases, aber die werde ich jetzt zu einem machen. Aber wenn ich insgesamt im Programm 3 Eventcases hab (einen pro MEssart), jedoch immer nur einer verwendet wird pro Programmaufruf, dann dürfen die sich doch nicht stören.
Aus welchem Grund sollten denn die drei Eventstrukturen nötig sein? Diese eine Struktur kann doch alle deine Events abfangen!