AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Tastaturpuffer löschen?

Ein Thema von Popov · begonnen am 12. Mai 2012 · letzter Beitrag vom 14. Mai 2012
Antwort Antwort
Popov
(Gast)

n/a Beiträge
 
#1

Tastaturpuffer löschen?

  Alt 12. Mai 2012, 13:53
Ein kleines Problem: mein Tool reagiert auf zwei Tasten in OnKeyDown, auf Escape und Return. Beim drücken der Return Taste wird eine Funktion ausgeführt die etwa 1 Sekunde dauert. Klicke ich 10 mal auf Return, wird das anscheinend nacheinander abgearbeitet. Drücke ich 10 mal Return und dann Escape, dauert es somit 10 Sekunden bis das Programm beendet wird.

So wie ich das beobachte wird erst die Funktion abgearbeitet, bevor OnKeyDown wieder eine Taste empfängt.

Bevor ich etwas unnötiges proge, gibt es eine Möglichkeit am ende der Funktion den Tastaturpuffer zu löschen, so dass erst danach Tasten aktuell sind?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Tastaturpuffer löschen?

  Alt 12. Mai 2012, 14:10
Soll die Funktion nur einmal ausgeführt werden, auch wenn du 10 mal Return drückst?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: Tastaturpuffer löschen?

  Alt 12. Mai 2012, 14:29
Muß nicht sein. Eigentlich soll sie nur ausgeführt werden wenn Return gedrückt wird. Theoretisch kommt es nicht vor, dass man Return mehrmals nacheinander drückt. Nur habe ich zufällig festgestellt, dass man es machen könnte und dann wird die Funktion mehrmals ausgeführt. Wäre an für sich keine Katastrophe, wenn es die Esc Taste nicht blockieren würde.

Oder anders ausgedrückt: wenn man Return drei mal nacheinander geklickt hat, dann zwei mal zuviel.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Tastaturpuffer löschen?

  Alt 12. Mai 2012, 15:28
Tastaturpuffer leeren
Selbst nicht getestet.

gruss
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Tastaturpuffer löschen?

  Alt 12. Mai 2012, 17:16
Ist das wirklich der Tastaturpuffer? Oder nicht vielleicht eher der Message-Queue?

Das hier sollte alle Tastatur-Messages im Queue löschen:
Delphi-Quellcode:
procedure TfrmMain.ClearKeyboardMessages;
var
  Msg: TMsg;
begin
  while PeekMessage(Msg, 0, 0, 0, PM_REMOVE or (QS_KEY shl 16)) do
  begin
// Normalerweise:
// TranslateMessage(Msg);
// DispatchMessage(Msg);
// Aber da wir die Messages ignorieren, tun wir einfach nix
  end;
end;
Ist ungetestet, aber der Code ist nur minimal aus einer ähnlichen, funktionierenden Prozedur abgewandelt.

Mit PeekMessage gehen aber auch noch andere coole Sachen, z.B. kannst du gucken, ob irgendwo später im Message-Queue die Escape-Taste auftaucht, und dann abbrechen – ohne, dass der ganze Message-Queue dabei draufgeht. MSDN hat ein Beispiel, das ziemlich genau dein Problem abbildet.
Zitat:
Occasionally, an application needs to examine the contents of a thread's message queue from outside the thread's message loop. For example, if an application's window procedure performs a lengthy drawing operation, you may want the user to be able to interrupt the operation.
(Ich bin mir gerade nicht sicher, ob du nicht der warst, der in einem anderen Thread geschrieben hatte, dass er kein Englisch kann, daher mal kurz eine deutsche Übersetzung: „Manchmal muss eine Anwendung von außerhalb der Message-Loop eines Threads die Inhalte von dessen Message-Queue untersuchen. Wenn zum Beispiel die Fenster-Routine einer Anwendung eine längere Zeichen-Operation ausführt, willst du dem User u.u. die Möglichkeit geben, die Operation unterbrechen.“)

Geändert von Namenloser (12. Mai 2012 um 17:20 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#6

AW: Tastaturpuffer löschen?

  Alt 14. Mai 2012, 07:19
Ich habe beides noch nicht zum laufen gekriegt, oder zumindest nicht so wie ich es mir vorstelle.

Ich habe das Problem vorläufig simpel gelöst:
Delphi-Quellcode:
  if IsBusy then Exit;
  IsBusy := True;
  MachWas; //inc. ProcessMessages
  IsBusy := False;
Das, aber nur in Verbindung mit ProcessMessages, funktioniert sogar brauchbar. Neue Anweisungen werden solange abgewiesen bis die Funktion fertig ist.

Trotzdem interessiert mich das Leeren des Puffers, nur jetzt eher allgemein. Ich gucke mal wieso es nicht so geklappt hat, vielleicht lag der Fehler bei mir.

Ich hab es getestet, es ist tatsächlich so, dass, wenn eine Funktion eine Sekunde in Anspruch nimmt, der zweite Tastendruck erst eine Sekunde später OnKeyDown erreicht.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2023, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf