![]() |
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:
Das läuft auch problemlos, nur bin ich vollkommen verunsichert was
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;
Delphi-Quellcode:
angeht.
FListe.Free;
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:
nicht ein Speicherleck ein?
FListe.Free
Gruß K-H |
AW: Mehre Threads: wie Daten übergeben
Mach doch einfach eine dynamisches Stringarray und gut ist?! array of string!
|
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 |
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. |
AW: Mehre Threads: wie Daten übergeben
Zitat:
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:
Delphi-Quellcode:
;
Fliste:=Liste
Gruß K-H |
AW: Mehre Threads: wie Daten übergeben
Zitat:
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 |
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... |
AW: Mehre Threads: wie Daten übergeben
Entweder das:
Delphi-Quellcode:
oder das
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;
Delphi-Quellcode:
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.
thread.Create(const liste:tstringlist);
begin fListe:=liste; end; thread.execute; begin machwasmitfliste; //fliste.free {nein!!! end; Mit der zweite Variante wirst du dir aber über kurz oder lang ärger einhandeln. |
AW: Mehre Threads: wie Daten übergeben
Zitat:
Hobbycoder hat mich auf den richtigen Weg gebracht, wobei mir nicht so ganz kar ist warum
Delphi-Quellcode:
mir früher oder später Ärger bereiten sollte, wenn sicher ist, daß nicht mehrere Threads gleichzeitig zugreifen.
fListe=liste;
Gruß K-H |
AW: Mehre Threads: wie Daten übergeben
Zitat:
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:03 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 by Thomas Breitkreuz