![]() |
Threads bleiben stehen nach Aktualisierung
Hallo Leute!
Ich habe ein Problem! Ich habe eine Klasse geschrieben, die mehrere Threads verwaltet, diese Threads haben die Aufgabe, einen bestimmten Host anzupingen (Per IdIcmpClient) Das klappt auch alles. Die Ergebnisse werden in eine Containerklasse geschrieben, die eine TThreadlist kapselt. In dieser Containerklasse gibt es jetzt die Methode
Delphi-Quellcode:
Diese Methode wird zum Beispiel über einen Buttonklick ausgelöst (!!Extern!!)
UpdateListbox(SL: TStrings)
Das updaten der Listbox funktioniert, aber danach bleiben die Threads einfach stehen. Der Threadstatus ist aber weiterhin "Ausführbar". Der gesetzte Breakpoint in der "While-not-Terminated" schleife wird nicht mehr erreicht. Die UpdateListbox Prozedur sieht so aus:
Delphi-Quellcode:
In jedem Thread befindet sich ein Pointer auf diese Liste, damit Einträge hinzugeügt werden können.
procedure TPingResultList.UpdateListbox(SL: TStrings);
var i: integer; begin SL.Clear; if FPingResults.LockList.Count > 0 then for i := 0 to FPingResults.LockList.Count - 1 do begin SL.Add(TPingResult(FPingResults.LockList.Items[i]).StringResult) end; end; Woran liegt das? Wie kann ich das umgehen? Gruß und danke schonmal Richard |
Re: Threads bleiben stehen nach Aktualisierung
Zitat:
Grüße, Messie |
Re: Threads bleiben stehen nach Aktualisierung
seh ich das richtig? du greifst von den Threads aus auf die Listbox zu? :shock:
hast du im Thread mal einen Haltepunkt gesetzt bzw. durchgesteppt um zu sehen wo er letzendlich hängt? |
Re: Threads bleiben stehen nach Aktualisierung
Nein, das siehst du nicht richtig :mrgreen:
Ich habe eine Weitere Klasse, die die Ergebnisse verwaltet, vom Thread aus gibts da lediglich einen Pointer, der auf diese Liste zeigt. Diese Liste hat eine UpdateListbox procedure, die ich Über einen Button von meiner MainForm auslöse. Das mit dem Unlock könnte schon stimmen, aber wie muss ich das Einbauen? Ich habs so
Delphi-Quellcode:
probiert, aber der Effekt ist exakt gleich...
SL.Clear;
if FPingResults.LockList.Count > 0 then for i := 0 to FPingResults.LockList.Count - 1 do begin SL.Add(TPingResult(FPingResults.LockList.Items[i]).StringResult) end; FPingResults.UnlockList; Oder hab ich das mit Unlock falsch verstanden? Es ist halt so, dass die Threads nicht mehr weitermachen, also das mit dem Lock kommt hin, aber so wie oben klappts jedenfalls auch nicht... :wall: Danke für eure Anteilnahme :mrgreen: .............................................. @ dein Edit: Ja ich hab nen Breakpoint in den Thread gelegt, der hängt dann da, wo er aufgehört hat... also MUSS das mit dem Lock/Unlock zu tun haben aber wie muss ich es richtig verwenden??? |
Re: Threads bleiben stehen nach Aktualisierung
Nee nee, das hast Du etwas falsch verstanden. LockList gibt dir eine Liste zurück, in der Du dann exklusiv rumwuseln kannst. Wenn Du fertig bist, dann rufst du 'UnlockList' auf:
Delphi-Quellcode:
'LockList' liefert nicht nur die Liste zurück, sondern sperrt jeden weiteren Versuch, LockList aufzurufen. Daher hängt dein Thread auch.
Var
MyList : TThreadList; ... Procedure TMyThread.ProcessList; Var lLocal : TList; Begin lLocal := MyList.LockList; Try -- hier lLocal verändern Finally MyList.UnlockList; End End; |
Re: Threads bleiben stehen nach Aktualisierung
Ich hab das jetzt so gemacht und es funktioniert! :hello:
Delphi-Quellcode:
Hatte nicht bedacht, dass bei jedem Aufruf von Locklist... klingt irgendwie blöd ich weiß... die Liste gelockt wird :wall:
SL.Clear;
try with FPingResults.LockList do begin if Count > 0 then for i := 0 to Count - 1 do begin SL.Add(TPingResult(Items[i]).StringResult) end; end; finally FPingResults.UnlockList; end; Danke Euch! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 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-2025 by Thomas Breitkreuz