Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#41

Re: Liste Thread sicher abholen

  Alt 10. Jun 2008, 15:51
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)
  Mit Zitat antworten Zitat