![]() |
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:
cu
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; Oliver |
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:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz