Oh Backe, da läuft mächtig was schief. So geht es nicht. Folgendes Problem:
Mein Thread läuft sauber und ordentlich und arbeitet seine Execute-Methode ab.
Delphi-Quellcode:
procedure TShutDownThread.Execute;
begin
while not Terminated do begin
Lock;
try
FWindowList.EnumTopLevelWindows; // interne liste aktualisieren
Sleep(Interval); // warte mal die eingestellte Zeit, nicht so 'ne Hektik (prefered 200)
finally
Unlock;
end;
end;
end;
Ok, sieht ja mal simpel und somit gut aus.
Jetzt meine Public-Methode des Threads zum Abholen der Werte der Liste.
Delphi-Quellcode:
procedure TShutDownThread.GetWindowList(const AList: TWindowList);
var
WinParamObj: TWinParamClass;
begin
if not Assigned(AList) then
Exit;
Lock;
try
AList.AssignList(FWindowList);
finally
UnLock;
end;
end;
AssignList habe ich an dieser Stelle zusätzlich implementiert. Ist auch logisch und kein Hit. Sollte jemand damit Sorgen haben poste ich den Code.
Nun passiert folgendes. Rufe ich in meinem Programm diese Methode auf
Delphi-Quellcode:
procedure TForm1.RefreshWindowList;
var
WindowList: TWindowList;
begin
if assigned(FShutDownThread) then
begin
WindowList := TWindowList.Create;
try
FShutDownThread.GetWindowList(WindowList);
........
steht die Anwendung.
Ich habe mit dem Debugger die entsprechende Stelle gefunden. Es ist der Aufruf Lock in der Thread-Methode GetWindowList. Lock implementiert hier
Delphi-Quellcode:
procedure TShutDownThread.Lock;
begin
EnterCriticalSection(FLock);
end;
Genau aus EnterCriticalSection kehrt die Procedur nicht zurück.
Da läuft doch was schief in meiner Logik. ich denke mal ich habe das was entscheidendes in der Handhabung der CriticalSection nicht verstanden oder bringe was in der Abarbeitung des Threads furcheinander. Das ist doch nur ein Verständnis und Handlingproblem meinerseits?
Wenn mir da mal einer auf die Sprünge helfen kann, währe toll.
Gruß oki