Thema: Delphi Letzte Eingabe ermitteln

Einzelnen Beitrag anzeigen

Benutzerbild von Manzoni
Manzoni

Registriert seit: 15. Feb 2004
Ort: Berlin
120 Beiträge
 
Delphi 7 Enterprise
 
#1

Letzte Eingabe ermitteln

  Alt 29. Sep 2004, 12:56
Hi Leute,

Ich habe folgendes Problem: Ich möchte ermitteln, wann die letzte Eingabe durch den Benutzer erfolgt ist. Ich habe bereits folgende Funktion in der DP gefunden:
Delphi-Quellcode:
function LastInput: DWord;
var
  LInput: TLastInputInfo;
begin
  LInput.cbSize := SizeOf(TLastInputInfo);
  GetLastInputInfo(LInput);
  Result := GetTickCount - LInput.dwTime;
end;
Problem ist, dass die Funktion ja permanent überprüfen muss, ob mein Zeitlimit überschritten wurde. Ich habe die Funktion in einen eigenen Thread ausgelagert um mein Hauptprogramm nicht lahm zu legen nur verursacht der Thread nahezu 100% Auslastung. Gibt es eine bessere Möglichkeit? Hier nochmal der Code des Gesamten Thread:
Delphi-Quellcode:
unit UIdleThread;

interface

uses
  Windows, Types, Classes, SysUtils, Forms;

type
  TIdleThread = class(TThread)
  private
    { Private-Deklarationen }
    idletime : Longword;
    mode : boolean;
    function LastInput: DWord;
    procedure Display;
    procedure event;
  protected
    procedure Execute; override;
  public
    constructor create(idle : Longword; suspend : boolean);
    procedure new_idle(idle : Longword);
  end;

implementation

uses UMain;

function TIdleThread.LastInput: DWord;
var
  LInput: TLastInputInfo;
begin
  LInput.cbSize := SizeOf(TLastInputInfo);
  GetLastInputInfo(LInput);
  Result := GetTickCount - LInput.dwTime;
end;

procedure TIdleThread.new_idle(idle : Longword); //min_input
begin
  idletime:=idle*60000;
end;

constructor TIdleThread.create(idle : Longword; suspend : boolean);
begin
  inherited create(suspend);
  idletime:=idle*60000;
  mode:=true;
end;

procedure TIdleThread.Execute;
begin
  while true do
  begin
    if mode then
    begin
      if LastInput>idletime then event;
    end
    else
    begin
      if LastInput=10 then event;
    end;
    Application.ProcessMessages;
  end;
end;

procedure TIdleThread.event;
begin
  Synchronize(Display);
  mode:=not mode;
end;

procedure TIdleThread.display;
begin
  FClient.set_idle_stat(mode);
end;

end.
Danke und Mfg, Manzoni
Bob
  Mit Zitat antworten Zitat