Avatar billede ossys Mester
20. november 2019 - 17:30 Der er 3 kommentarer og
1 løsning

Delphi - tømning af tastaturbufferen

Et sikkert meget banalt problem. Men det irriterer mig.

Jeg har brug for, at kunne tømme tastaturets buffer. Nogle brugere kan ikke holde fingrene fra tastaturet medens computeren arbejder Det er ikke verdens hurtigste computer jeg arbejder med!: Hvordan tømmer jeg bufferen?? Løsningen kunne jo også være at blokerer for tastetryk..
Avatar billede arne_v Ekspert
20. november 2019 - 18:59 #1
Ikke nogen speciel smart loesning men:
* start en traad som tester et done flag og ellers kalder ReadKey i en loekke
* naar input er OK saa saetter du done flag og traad afslutter
Avatar billede ossys Mester
21. november 2019 - 01:23 #2
Hej Arne_V. Den løsning må jeg prøve i morgen!
Avatar billede arne_v Ekspert
21. november 2019 - 01:57 #3
Eksempel:


program SkipKeys;

uses
  Classes, SysUtils, Windows, Crt;

type
  Skipper = class(TThread)
  protected
    procedure Execute; override;
  end;

var
  done : boolean;

procedure Skipper.Execute;

begin
  while not done do begin
    if KeyPressed then begin
      ReadKey;
    end else begin
      Sleep(10);
    end;
  end;
end;

var
  skipt : Skipper;

procedure StartBlock;

begin
  done := false;
  skipt := Skipper.Create(true);
  skipt.Start;
end;

procedure StopBlock;

begin
  done := true;
  skipt.WaitFor;
  skipt.Terminate;
  skipt.Free;
end;

begin
  StartBlock;
  writeln('Enter something');
  Sleep(5000);
  StopBlock;
  writeln('Enter something again');
  writeln('You entered: ' + ReadKey);
end.


Jeg vil stadig ikke udelukke at en mere elegant løsning eksisterer, men det var hvad jeg lige kunne komme op med.

NB: done bør erklæres volatile, men det er ikke understøttet i min version af FPC.
Avatar billede ossys Mester
21. november 2019 - 09:33 #4
Hej Arne_V

I en MEGET sen nattetime fandt jeg på nettet nedenstående løsning, som er gennemprøvet her til morgen. Den ser ud til at virke efter hensigten!

Tak for dit input, som jo er lidt mere omfattende.  Jeg så først din løsning her til morgen!

procedure ClearInputBuffer;
var
  Msg: TMsg;
begin
  while PeekMessage(Msg, 0, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE or
PM_NOYIELD) do;
  while PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE or PM_NOYIELD) do;
end;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester