Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Mehre Threads: wie Daten übergeben (https://www.delphipraxis.net/192356-mehre-threads-wie-daten-uebergeben.html)

p80286 11. Apr 2017 16:18

Mehre Threads: wie Daten übergeben
 
Hallo zusammen,
ich bastele gerade einen Programmteil neu, der Directoryeinträge verarbeiten soll.
Die Dateinamen sind in einer Stringliste, die ich so übergebe

Delphi-Quellcode:
thread
  fListe:tstringlist;

thread.Create(const liste:tstringlist);
begin
  fListe:=tstringlist.create;
end;

thread.execute;
begin
  machwasmitfliste;
 fliste.free {------------------ ja oder nein????}
end;  



globallist:=tstringlist.Create;
Fillgloballist;
thread.create(globallist);
thread.resume;
Das läuft auch problemlos, nur bin ich vollkommen verunsichert was
Delphi-Quellcode:
FListe.Free;
angeht.
Gebe ich da nur die "Verwaltungsstruktur" frei und die Daten (globallist) bleiben erhalten, oder sind auch die Daten futsch?
Handele ich mir durch das Fehlen von
Delphi-Quellcode:
FListe.Free
nicht ein Speicherleck ein?

Gruß
K-H

TiGü 11. Apr 2017 16:23

AW: Mehre Threads: wie Daten übergeben
 
Mach doch einfach eine dynamisches Stringarray und gut ist?! array of string!

Klaus01 11. Apr 2017 16:24

AW: Mehre Threads: wie Daten übergeben
 
passiert da noch so etwas wie flist.assign(liste)?

So gibts du eine leere Liste frei, die globale liste bleibt erhalten.

Grüße
Klaus

SebastianZ 11. Apr 2017 16:28

AW: Mehre Threads: wie Daten übergeben
 
Ich würde sagen, wenn der Thread die die Liste aufbaut, dann hat der Thread die Hoheit über die Liste und somit sollte auch der Thread die Liste wieder abbauen.
Mit dem Array wurde ja schon eine alternative genannt.

Bitte achte darauf die Zugriffe auf die Stringlist oder den Array abzusichern, wenn der Hauptthread und der Thread beide auf die Liste zugreifen.

p80286 11. Apr 2017 16:35

AW: Mehre Threads: wie Daten übergeben
 
Zitat:

Zitat von SebastianZ (Beitrag 1367201)
Bitte achte darauf die Zugriffe auf die Stringlist oder den Array abzusichern, wenn der Hauptthread und der Thread beide auf die Liste zugreifen.

Das ist gesichert!

Warum sollte ich auf die Segnungen moderner Strukturen verzichten? Weil die simplen alten keine Probleme machen?

Der Thread arbeitet mit den Daten und es kann (unwahrscheinlich) sein, daß nach Beendigung des Threads keine Daten mehr vorhanden sind.
Dann sollte Globallist.Count=0 aber noch funktionieren, denn Globallist gehört meiner Meinung nach dem MainThread?

:oops:Das hab ich überlesen:
Zitat:

Zitat von Klaus01 (Beitrag 1367199)
passiert da noch so etwas wie flist.assign(liste)?

So gibts du eine leere Liste frei, die globale liste bleibt erhalten.

Nein kein assign nur
Delphi-Quellcode:
Fliste:=Liste
;


Gruß
K-H

Fritzew 11. Apr 2017 16:58

AW: Mehre Threads: wie Daten übergeben
 
Zitat:

Das läuft auch problemlos, nur bin ich vollkommen verunsichert was FListe.Free; angeht.
Gebe ich da nur die "Verwaltungsstruktur" frei und die Daten (globallist) bleiben erhalten, oder sind auch die Daten futsch?
Handele ich mir durch das Fehlen von FListe.Free nicht ein Speicherleck ein?
Durch die Zuweisung von Fliste := Liste zeigen beide Variablen auf die selbe Instance.
In diesem Fall darfst du die fListe nicht freigeben. Eigentlich gilt hier wie immer die Regel wer etwas erzeugt sollte es auch freigeben.
Ich würde aber die Stringliste im Constructor einfach kopieren, entweder mit liste.Assign(liste) oder Liste.text := Liste.text;
Dann kann der Thread seine Arbeit machen ohne ungewünschte Seiteneffekte

stahli 11. Apr 2017 17:00

AW: Mehre Threads: wie Daten übergeben
 
Du bist da offenbar bei Deiner Fragestellung etwas durcheinander gekommen.

Wird fListe nun im Thread neu createt oder wird Liste der fListe zugewiesen (und warum überhaupt)?

Im ersten Fall musst Du fListe freigeben, was keine Auswirkungen auf Liste hat.
Im zweiten Fall entspricht fListe = Liste und Du darfst diese nicht freigeben.

Ich denke, Du musst Dein Problem nochmal konkretisieren...

Hobbycoder 11. Apr 2017 17:20

AW: Mehre Threads: wie Daten übergeben
 
Entweder das:
Delphi-Quellcode:
thread.Create(const liste:tstringlist);
begin
   fListe:=tstringlist.create;
   fListe.Assgin(Liste);
end;

 thread.execute;
begin
   machwasmitfliste;
   
   //Hier muss fListe aber noch zurück in liste

  fliste.free {ja!!!!}
end;
oder das
Delphi-Quellcode:
thread.Create(const liste:tstringlist);
begin
   fListe:=liste;
end;

 thread.execute;
begin
   machwasmitfliste;
  //fliste.free {nein!!!
end;
Ein fListe:=TStringList.Create macht ja keinen Sinn, wenn ich danach den der Variable fListe einfach mal auf eine andere STringList zeigen lassen. Und wenn ich das dann noch Freigebe, ist die Globale Liste weg.

Mit der zweite Variante wirst du dir aber über kurz oder lang ärger einhandeln.

p80286 11. Apr 2017 21:51

AW: Mehre Threads: wie Daten übergeben
 
Zitat:

Zitat von stahli (Beitrag 1367208)
Du bist da offenbar bei Deiner Fragestellung etwas durcheinander gekommen.

Ich denke, Du musst Dein Problem nochmal konkretisieren...

Nö, ich hab mir da nur selbst auf der Leitung gestanden.
Hobbycoder hat mich auf den richtigen Weg gebracht, wobei mir nicht so ganz kar ist warum
Delphi-Quellcode:
fListe=liste;
mir früher oder später Ärger bereiten sollte, wenn sicher ist, daß nicht mehrere Threads gleichzeitig zugreifen.

Gruß
K-H

himitsu 11. Apr 2017 22:04

AW: Mehre Threads: wie Daten übergeben
 
Zitat:

Delphi-Quellcode:
thread.Create(const liste:tstringlist);
begin
  fListe:=tstringlist.create;
end;

thread.execute;
begin
  machwasmitfliste;
 fliste.free {------------------ ja oder nein????}
end;

Nein.

Freigabe natürlich möglichst immer in der selben Ebene, wo es auch erstellt wurde.

Create -> Destroy


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:05 Uhr.
Seite 1 von 2  1 2      

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