Einzelnen Beitrag anzeigen

oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#40

Re: Liste Thread sicher abholen

  Alt 10. Jun 2008, 13:54
Menne, Erfolg auf der ganzen Linie !!!

Wenns denn auch wirklich sicher läuft? Aber das sollte es schon tun. Auf irgend was muss man sich halt auch einfach mal verlassen.

Der Basiscode ist auch erschreckend simpel. So hatte ich mir das auch vorgestellt.

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
    FCS.Enter;
    try
      FWindowList.EnumTopLevelWindows;
      Sleep(Interval);
    finally
      FCS.Leave;
    end;
  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
  FWindowList.EnumTopLevelWindows; // Alle Windows auflisten
end;
Ist eingendlich nicht viel für sooon langen Thread.

Ich hoffe jetzt kommt nicht einer um die Ecke und erklärt mir, dass das alles totaler Stuß ist was ich hier schreibe. Drücken wir mal die Daumen. Erläuterungen brauch jetzt wohl nicht mehr machen. Der Thread erzählt genug.

Herzlichen Dank an alle. Das sauber zu lösen war mir wichtig.

Gruß oki
42
  Mit Zitat antworten Zitat