Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Letzte Eingabe ermitteln (https://www.delphipraxis.net/30792-letzte-eingabe-ermitteln.html)

Manzoni 29. Sep 2004 12:56


Letzte Eingabe ermitteln
 
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

KrasserChecker 29. Sep 2004 13:06

Re: Letzte Eingabe ermitteln
 
Hi,

das
Code:
Application.ProcessMessages;
bringt hier nix (da der Thread ja nicht der Hauptprozess ist).
Ersetze einfach diese Zeile durch
Code:
sleep(1);
und schon sollte alles wie gewünscht laufen

Manzoni 29. Sep 2004 13:41

Re: Letzte Eingabe ermitteln
 
Danke für den Tip! An dieser Stelle hatte ich früher schon mal sleep(10), was aber nicht funktionierte. sleep(1) geht wunderbar. Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz