Delphi-PRAXiS
Seite 5 von 5   « Erste     345   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Liste Thread sicher abholen (https://www.delphipraxis.net/115283-liste-thread-sicher-abholen.html)

Sir Rufo 10. Jun 2008 15:51

Re: Liste Thread sicher abholen
 
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

oki 10. Jun 2008 17:11

Re: Liste Thread sicher abholen
 
Hi Oliver,

klar, grundsätzlich hast du recht. Ich hatte erst mal das Schützen in Execute gesetzt, da ich hier noch weitere Methoden aufrufen wollte. Ich denke aber so wie du es korrigiert hast ist es besser. Vererbt man die Klasse ist man schnell dabei protected Methoden aufzurufen. Das würde dann bezüglich Threadsicherheit in die Hose gehen. Somit ist das aktuell zwar kein Fehler, aber dann auch nicht sauber gecodet. Und das war ja eins meiner Ziele.

Dank dir für deine Kontrolle,

Gruß oki


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:28 Uhr.
Seite 5 von 5   « Erste     345   

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