AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mehre Threads: wie Daten übergeben

Ein Thema von p80286 · begonnen am 11. Apr 2017 · letzter Beitrag vom 12. Apr 2017
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#1

Mehre Threads: wie Daten übergeben

  Alt 11. Apr 2017, 17:18
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 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?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Mehre Threads: wie Daten übergeben

  Alt 11. Apr 2017, 17:23
Mach doch einfach eine dynamisches Stringarray und gut ist?! array of string!
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Mehre Threads: wie Daten übergeben

  Alt 11. Apr 2017, 17:24
passiert da noch so etwas wie flist.assign(liste)?

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

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
SebastianZ

Registriert seit: 23. Jul 2009
89 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Mehre Threads: wie Daten übergeben

  Alt 11. Apr 2017, 17:28
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.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Mehre Threads: wie Daten übergeben

  Alt 11. Apr 2017, 17:35
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?

Das hab ich überlesen:
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 Fliste:=Liste ;


Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (11. Apr 2017 um 17:38 Uhr)
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Mehre Threads: wie Daten übergeben

  Alt 11. Apr 2017, 17:58
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
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Mehre Threads: wie Daten übergeben

  Alt 11. Apr 2017, 18:00
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...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#8

AW: Mehre Threads: wie Daten übergeben

  Alt 11. Apr 2017, 18:20
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.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Mehre Threads: wie Daten übergeben

  Alt 11. Apr 2017, 22:51
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 fListe=liste; mir früher oder später Ärger bereiten sollte, wenn sicher ist, daß nicht mehrere Threads gleichzeitig zugreifen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#10

AW: Mehre Threads: wie Daten übergeben

  Alt 11. Apr 2017, 23:04
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:34 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