Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Threads bleiben stehen nach Aktualisierung (https://www.delphipraxis.net/92735-threads-bleiben-stehen-nach-aktualisierung.html)

Tormentor32 25. Mai 2007 07:16


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:
UpdateListbox(SL: TStrings)
Diese Methode wird zum Beispiel über einen Buttonklick ausgelöst (!!Extern!!)

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:
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;
In jedem Thread befindet sich ein Pointer auf diese Liste, damit Einträge hinzugeügt werden können.

Woran liegt das? Wie kann ich das umgehen?

Gruß und danke schonmal

Richard

messie 25. Mai 2007 08:57

Re: Threads bleiben stehen nach Aktualisierung
 
Zitat:

Zitat von Tormentor32
In jedem Thread befindet sich ein Pointer auf diese Liste, damit Einträge hinzugefügt werden können.

Kann das sein, daß die Liste noch auf Lock steht, und die Threads auf das Unlock der Liste warten?

Grüße, Messie

SirThornberry 25. Mai 2007 09:06

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?

Tormentor32 25. Mai 2007 09:17

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:
  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;
probiert, aber der Effekt ist exakt gleich...

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???

alzaimar 25. Mai 2007 09:35

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:
Var
  MyList : TThreadList;

...

Procedure TMyThread.ProcessList;
Var
  lLocal : TList;

Begin
  lLocal := MyList.LockList;
  Try
    -- hier lLocal verändern
  Finally
    MyList.UnlockList;
  End
End;
'LockList' liefert nicht nur die Liste zurück, sondern sperrt jeden weiteren Versuch, LockList aufzurufen. Daher hängt dein Thread auch.

Tormentor32 25. Mai 2007 09:55

Re: Threads bleiben stehen nach Aktualisierung
 
Ich hab das jetzt so gemacht und es funktioniert! :hello:

Delphi-Quellcode:
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;
Hatte nicht bedacht, dass bei jedem Aufruf von Locklist... klingt irgendwie blöd ich weiß... die Liste gelockt wird :wall:

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