Frage deutsch
~~~~~~~~~~~~~
Wie kann man Tasteneingaben schneller als mit INKEY$ abfragen?
 

Question English
~~~~~~~~~~~~~~
Is there any faster and more efficient equivalent for INKEY$ ?
 

Antwort 1
~~~~~~~~
[ von
http://quickbasic.megapage.de/ ]
 
Wenn ihr dauernd den INKEY$-Befehl zur Tastaturabfrage nutzt, ist der
Befehl, "keycode = INP(&H60)" um einiges schneller!
 

Anmerkung von Pawel Kazakow (
www.pkworld.de ):
ACHTUNG: Die Abfrage des Tastaturpuffers über INP(&H60) führt (vorallem unter DOS) öfters dazu, dass der Tastaturtreiber abstürtzt und die meisten Tasten nicht mehr reagieren.
Mein Programm EditLine 3.4 benutzt eine von mir entwickelte Tastaturabfrage, die sogar die Kombination STRG+EINFG ermöglicht und Probleme weder unter DOS noch unter Windows bereitet (Ich verwende nur die PEEK-Funktion). Die Abfrage der Tasten erfolgt direkt über den Tastaturpuffer, so dass sogar die Auswertung der drei gleichzeitig gedrückten Tasten möglich wird, was u.a. bei Spieleprogrammierung hoch geschätzt wird. (Ich werde die Funktion demnächst so umbauen, dass sie universell einsetzbar wird.)
 
EditLine steht auf meiner Webseite zum Herunterladen bereit.
 
 

Antwort 2
~~~~~~~~
[ von Andy
andyb*planet-interkom.de ]
Du solltest am besten die Tastenbetätigung im Tastaturpuffer direkt abfragen, ohne INKEY$ zu verwenden. Zum Beispiel mit
x = INP(&H60)
 
x liefert Dir die Infoermation. ob die Taste gerade gedrückt wird, bzw. ob diese zuletzt gedrückt wurde. Du mußt aber trotzdem zusätzlich immer wieder den Tastaturpuffer ganz schnell leeren. Am besten gleich 1, 2 oder 3x hintereinander mit
tmp$ = inkey$.
 
Probiere mal folgenden Code in einem neuen Projekt
CLS
usw:
x = inp(&H60)
REM tmp$ = inkey$
Locate 1, 1: Print "Code: ";x
goto usw
 
Hier wird nach dem 15 Tastendruck einen ekelhafter Ton aus dem PC-
Lautsprecher kommen, mache also mal (und ich hoffe das geht) nach dem x
und vor dem Locate das REM weg und beobachte mal was dann passiert!
 
Der Tastaturcode ist ein völlig anderer als der von INKEY$. Ihr solltet
also diese kleine Routine mal schreiben und starten, Taste drücken
(HALTEN!) und dann erst loslassen. Dabei beobachten was INP
zurückliefert. Das ganze hat einen Nachteil: Man kann nicht feststellen
"wurde + gedrückt?" sondern nur "wird gehalten?" und anschließend
"welche Taste wurde zuletzt losgelassen?"
 

Antwort 3
~~~~~~~~
[ von Andy
andyb*planet-interkom.de ]
 
Aber ich habe eine bessere und viel viel schnellere Idee gefunden. Man
muss sich das so vorstellen:

In meinen Programm gibt es einen, naja, nennen wir ihn mal großzügig "Mini-
Kernel". Der verteilt so einzelne Sachen wie WAVE-Dateien abspielen,
Schrift darstellen, Fenster bewegen usw. wie Win (nicht NT). Ein "Task"
wird nach und nach an "den Prozessor geschickt".
 
Aber auch die Tastatur muß abgefragt werden. So, mein Programm bzw. Kernel
wird bei meinem Rechner (P2-266 Mhz) in der Regel rund 30,000 x pro
Sekunde durchlaufen. Jetzt habe ich mich gefragt, welcher flinke Finger
drückt 30,000 Tasten pro Sekunde? Also habe ich eine Variable genommen die
KeyTicks heißt, und wenn der Kernel abgearbeitet wird, wird KeyTicks um 1
erhöht und alle 100 Kernel-Durchläufe wird die Tastatur abgefragt und
ausgewertet. Vorteil: ca. 8% Leistungszuwachs. Nachteil: Keiner und den
Wert auf 200 oder 300 setzen bringt komischerweise keinen
Geschwindigkeitszuwachs.
 
Tausche ich aber INKEY$ mit dem INP(&H60) Befehl aus, habe ich im
übrigen max. 1% weniger Prozessorauslastung...
 

Answer 4
~~~~~~~~
Instead of using "INKEY$", you can use "INP(&H60)"
This returns a code when a key is pressed, and thesame code + 128
when released! This works much faster and is very useful!
Example:

K = INP(&H60)
IF K = 27 THEN PRINT "ESC PRESSED"
IF K = 155 THEN PRINT "ESC RELEASED"
 
Happy programming! --- Tip by Jorden Chamid - Future Software
 

Antwort 5
~~~~~~~~
[ von Soeren Dressler (
www.qmystic.de.vu ) ]
Soeren Dressler schlägt in Ausgabe 6 seiner sehr informativen "QBasic-Times" die folgende Lösung zur schnellen Tastaturabfrage vor:
 
Hier ist ein Beispiel das die Tasten des Keyboards in Echtzeit lesen kann.
Es weiß immer genau, welche Taste gerade gedrückt wird. Selbst wenn mehrere Tasten gleichzeitig gedrück werden. Das besondere ist, dass es ohne Assembler arbeitet.
 
Es ist aber wichtig, das NumLock ausgeschaltet ist, da es sonst zu Fehlern kommt.
Viel Spaß!

'****************************************************************************
' xKey.bas = Tastenauswertung direkt mit dem INP-Befehl ohne INPUT u.INKEX$
' ========
' Dieses Programm demonstriert die Tastatur-Direkt-Eingabe.
' Es greift direkt auf den Tastaurpuffer zu und erkennt in Echtzeit, ob
' eine oder mehrere Taste gedrueckt werden oder nicht. Es erkennt auch
' Sondertasten wie Alt und Strg. Ausserdem erfolgt eine Anzeige des
' Tastatur-Abfragecodes der gerade gedrueckten Taste(n). Dieser Code
' kann fuer den Befehl INP(&H60) verwendet werden. Das Programm arbeitet
' ganz ohne Assembler.
'
' Die Tastatur-Abfragecodes ("Scancodes") der einzelnen Tasten gehen auch
' aus der QBasic-Onlinehilfe hervor und sind dort aufgelistet unter
' "Inhalt | Tastatur-Abfragecodes"
'
' Wichtig!!!! [NumLock] muss AUS sein, da es sonst zu Problemen mit den
' Cursortasten kommt.
'
' Autor : Soeren Dressler
' eMail : soeren01*t-online.de
' WWW : http://qmystic.xxn.de
'
'****************************************************************************
DIM SHARED xkey%(128)
DIM SHARED tasten AS STRING * 300
'
CLS
DO ' Routine zum Ermitteln der Tasten
ii% = i%
i% = INP(&H60)
IF ii% <> i% AND i% < 128 THEN xkey%(i%) = -1
IF ii% <> i% AND i% >= 128 THEN xkey%(i% - 128) = 0
' Das war's schon
' Ausgabe der Tasten
tasten$ = ""
FOR n% = 1 TO 128
IF xkey%(n%) = -1 THEN MID$(tasten$, n% * 3, 3) = STR$(n%)
NEXT
LOCATE 1, 1
PRINT tasten$
'
' Verlasse Schleife wenn ESC gedrueckt wird und leere den Tastaturpuffer,
' um dessen Ieberlauf und das nervige Piepsen zu vermeiden. Das tut der
' INP-Befehl nicht.
LOOP UNTIL INKEY$ = CHR$(27)
 
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online unter www.antonis.de/faq/progs/xkey.bas .



Antwort 6
~~~~~~~~~
[ von CodeMaster im QB-Forum, 22.12.2001 ]
Ich kann dir zwei sehr gute Tipps geben. Wenn du Spiele programmieren willst, brauchst du was Professionelles, um deinen Tastaturstatus möglichst gut und schnell abgefragt zu bekommen. Da gibt's eine viel bessere Möglichkeit als INKEY$, welcher ziemlich langsam ist!!!
Schreibe:
KeyAscii = INP(&H60)


Achtung: Die Variable KeyAscii wird nun mit dem Ascii-Wert der gedrückten Taste besetzt. Das ist sehr gut für die Steuerungstasten und Sondertasten wie ALT, STRG, Funktionstasten F1-F12, Pos1, Ende, Bild hoch, Bild runter, Einfg, Entf...
 
Allerdings kann diese Routine nicht gut oder nur schlecht normale Tasten einlesen.Aber hier sind einige Codes für diese Routine:
72 = Cursor hoch
80 = Cursor runter
75 = Cursor links
77 = Cursor rechts
1 = Esc
57 = Leertaste
29 = STRG
56 = Alt
 
Außerdem solltest du eins bedenken, wenn du Tasten abfragst: Oft ist der Computer überlastet, da du ihn mit Abfragen überhäufst. Dadurch läuft der Tataturpuffer über und es kommt es zum unschönen Piepsen, welches auch das Programm anhält...
Dagegen kannst du Folgendes machen:
DEF SET = 0
POKE &H41A, PEEK(&H41C)
 
So, jetzt piepst es nicht mehr, und dein Programm wird nicht angehalten.
 
Gruß,
CodeMaster
 

[ The QBasic-MonsterFAQ --- Start Page: www.antonis.de/faq ]