INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Wo werden Tasteneingaben gepuffert??



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

26.07.2008, 11:49
Beitrag #1

labruss Offline
LVF-Grünschnabel
*


Beiträge: 11
Registriert seit: Jul 2008

7.1
-
de

71638
Deutschland
Wo werden Tasteneingaben gepuffert??
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
27.07.2008, 13:21
Beitrag #2

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.697
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Wo werden Tasteneingaben gepuffert??
' 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.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30.07.2008, 07:56
Beitrag #3

labruss Offline
LVF-Grünschnabel
*


Beiträge: 11
Registriert seit: Jul 2008

7.1
-
de

71638
Deutschland
Wo werden Tasteneingaben gepuffert??
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30.07.2008, 08:20
Beitrag #4

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
Wo werden Tasteneingaben gepuffert??
' 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

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30.07.2008, 08:34
Beitrag #5

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.697
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Wo werden Tasteneingaben gepuffert??
' 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.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
31.07.2008, 07:57
Beitrag #6

labruss Offline
LVF-Grünschnabel
*


Beiträge: 11
Registriert seit: Jul 2008

7.1
-
de

71638
Deutschland
Wo werden Tasteneingaben gepuffert??
Kann man einen Tastendruck auch disablen??? Dachte das geht nur bei Buttons etc.

labruss
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
31.07.2008, 08:57
Beitrag #7

labruss Offline
LVF-Grünschnabel
*


Beiträge: 11
Registriert seit: Jul 2008

7.1
-
de

71638
Deutschland
Wo werden Tasteneingaben gepuffert??
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
31.07.2008, 10:28 (Dieser Beitrag wurde zuletzt bearbeitet: 31.07.2008 10:30 von Achim.)
Beitrag #8

Achim Offline
*****
*****


Beiträge: 4.223
Registriert seit: Nov 2005

20xx
2000
EN

978xx
Deutschland
Wo werden Tasteneingaben gepuffert??
' schrieb:UNd wie kann ich einen Befehl vor der Abarbeitung abfangen??
Rtmfx
   


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

"Is there some mightier sage, of whom we have yet to learn?"

"Opportunity is missed by most people because it is dressed in overalls and looks like work." (Thomas Edison)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
31.07.2008, 11:52
Beitrag #9

labruss Offline
LVF-Grünschnabel
*


Beiträge: 11
Registriert seit: Jul 2008

7.1
-
de

71638
Deutschland
Wo werden Tasteneingaben gepuffert??
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
31.07.2008, 12:34
Beitrag #10

Achim Offline
*****
*****


Beiträge: 4.223
Registriert seit: Nov 2005

20xx
2000
EN

978xx
Deutschland
Wo werden Tasteneingaben gepuffert??
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!

"Is there some mightier sage, of whom we have yet to learn?"

"Opportunity is missed by most people because it is dressed in overalls and looks like work." (Thomas Edison)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Gehe zu: