Hallo oki,
ich habe an deinem Code mal noch was geändert, so ist er wohl jetzt sauber.
- Sleep wird jetzt nicht mehr in der CS ausgeführt (schlafen sollte nun wirklich unkritische sein)
- Die procedure UpdateWindowList wird nun auch benutzt (wofür war die denn gedacht?)
Delphi-Quellcode:
type
TShutDownThread = class(TThread)
private
FCS: TCriticalSection; // CriticalSection
FShutDownList : TShutDownList; // Schließliste
FWindowList : TWindowList; // Liste der aktiven Fenster
FInterval : Integer; // Refreshzeit in ms
protected
procedure Execute; override;
procedure UpdateWindowList; // Fensterliste aktualisieren
public
constructor Create(CreateSuspended: Boolean); reintroduce; virtual;
Destructor Destroy; override;
Procedure GetWindowList(const AList : TWindowList); // Fensterliste abholen
property Interval : Integer read FInterval write FInterval;
end;
implementation
{ TTShutDownThread }
constructor TShutDownThread.Create(CreateSuspended: Boolean);
begin
inherited;
FCS := TCriticalSection.Create;
FWindowList := TWindowList.Create;
FShutDownList := TShutDownList.Create;
FInterval := 200;
end;
destructor TShutDownThread.Destroy;
begin
FCS.Enter;
try
FreeAndNil(FWindowList);
FreeAndNil(FShutDownList);
inherited Destroy;
finally
FCS.Leave;
try FreeAndNil(FCS); except end;
end;
end;
procedure TShutDownThread.Execute;
begin
while not Terminated do begin
UpdateWindowsList; // soll sich selbst um den kritischen teil kümmern ;)
Sleep(Interval); // ist definitiv nicht kritisch
end;
end;
procedure TShutDownThread.GetWindowList(const AList: TWindowList);
var
WinParamObj: TWinParamClass;
begin
if not Assigned(AList) then
Exit;
FCS.Enter;
try
AList.AssignList(FWindowList);
finally
FCS.Leave;
end;
end;
procedure TShutDownThread.UpdateWindowList;
begin
FCS.Enter;
try
FWindowList.EnumTopLevelWindows;
finally
FCS.Leave;
end;
end;
cu
Oliver
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)