Delphi-PRAXiS

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 StringList.Count ändert sich, wärend die Schleife läuft?? (https://www.delphipraxis.net/40945-stringlist-count-aendert-sich-waerend-die-schleife-laeuft.html)

romber 23. Feb 2005 16:28


StringList.Count ändert sich, wärend die Schleife läuft??
 
Hallo!

Beim Start schickt der UDP-Client seine IPAdresse an den Server. Diese IP-Adresse wird auf dem Server in eine TStringList hinzufügt. Nach bestimmtem Erreignissen schickt Server in einer Schleife Datenpackete an alle in der StringListe vorhandennen IP-Adresse:

Code:
...
for i := 0 to StringList1.Count - 1 do
Udp.Send(StringList1.Strings[i], 1234, 'Bestimmter Text');
...
Beim Schnießen sendet Client die IP-Adresse wieder an den Server und diese wird aus der Liste gelöscht. Was wird in diesem Fall passieren, wenn den String aus der Liste gelöscht wird, während die Schleife läuft? Wird die Schleife abgebrochen? Wenn ja, wie kann man das verhindern?

Kedariodakon 23. Feb 2005 16:45

Re: StringList.Count ändert sich, wärend die Schleife läuft?
 
Ähm Da eird es Zugriffsverletzungen geben, da nach meinem wissen Für jede Verbindung ein Tread erstellt wird.
Wenn dieser sich dann aus der Liste da austrägt, machts Boom, da die TStringList nicht Threadsicher ist.
:roll:


Da gibt es aber Thread sichere Listen, die sperrt man, arbeitet und entspert sie wieder wenn man fertig ist.
Wenn nun wer/Was anderes versucht drauf zuzugreifen wartet Er/Es bis er Zugriff bekommt, sperrt die Liste, arbeitet damit, entspert sie wieder ...

So im groben erklärt...
Ich hoffe das past so was ich erklärt hab :zwinker:

Bye

sniper_w 23. Feb 2005 16:47

Re: StringList.Count ändert sich, wärend die Schleife läuft?
 
Zitat:

Wenn ja, wie kann man das verhindern?
Ganz einfach. Lösche nichts während du in der Schleife bist.
Delphi-Quellcode:
// 
 var EnteredForLoop : Boolean = False;


//.......
 EnteredForLoop := true;
for i := 0 to StringList1.Count - 1 do
Udp.Send(StringList1.Strings[i], 1234, 'Bestimmter Text');
 EnteredForLoop := False;
//......


// wenn du was löschen willst, jederzeit:
 if not EnteredForLoop then
      begin
      // Code
      end;

romber 23. Feb 2005 17:12

Re: StringList.Count ändert sich, wärend die Schleife läuft?
 
Danke euch!

mschaefer 23. Feb 2005 17:17

Re: StringList.Count ändert sich, wärend die Schleife läuft?
 
Moin, moin
Odr nimm ein While Schleife, dann kannst Du im Konstrukt auch löschen.

Grüße /Martin

Sharky 23. Feb 2005 18:07

Re: StringList.Count ändert sich, wärend die Schleife läuft?
 
Zitat:

Zitat von sniper_w
....Ganz einfach. Lösche nichts während du in der Schleife bist....

Das löschen ist kein Problem. Aber die Schleife muss von oben nach unten durchlaufen werden.

Delphi-Quellcode:
var
  ndx : Integer;
begin
  For Pred (sl.count) downto 0 do
  begin
    Mache_mit_deiner_StringList_was_Du_möchtest (ausser ein .Free);
  end;
end;

mschaefer 23. Feb 2005 18:17

Re: StringList.Count ändert sich, wärend die Schleife läuft?
 
Moin, Mittelspätmoin,

Klasse! Wo das Simple doch so nah, baut man Codewüsten und Programmierserpentienen....

Grüße // Martin

Robert Marquardt 23. Feb 2005 18:41

Re: StringList.Count ändert sich, wärend die Schleife läuft?
 
Erst mal wird bei einer for-Schleife die Endebedingung nur einmal ausgewertet.
Es interessiert die Schleife also garnicht wenn sich bei "for I := 0 to List.Count - 1 do" Count aendert.
Entsprechend kracht es wenn man auf nicht mehr vorhandene Elemente zugreift.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:21 Uhr.

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