| Autor |
Beitrag |
OZ
      
Beiträge: 30
|
Verfasst: Fr 05.01.07 23:28
Hallo Leute
wie mache es, dass die Daten trotzdem in der TList (FResultlist) bleiben, ich aber nach dem Verlassen meiner Procudure (ThreadResult) die Var ContentStream in der aufrufenden Procedure wieder freigebenen kann (*.free)?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Type PStringStream = ^TStringStream; .... FResultlist: TList; .... procedure ThreadResult(ContentStream: TStringStream;); var P:PStringStream; begin New(p); p^:=TStringStream.Create(toEOF); p^:=ContentStream; FResultlist.Add(p); |
Danke!
|
|
Jakob Schöttl
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: Fr 05.01.07 23:51
Ich verstehe nicht, warum du mit Pointern Arbeitest, weil Objekte sowieso Zeiger auf Instanzen von Klassen sind.
Wenn du Object1.Free aufrufst, ist Object1 danach nil, also ein Nullzeiger. Und wie du selbst gesagt hast, erstellst du ihn mit Object1 := TObject.Create(...);
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: Fr 05.01.07 23:51
Hallo,
dass machst du indem du nicht den Zeiger kopierst, sondern den Inhalt: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| var P: Pointer; begin GetMem(P, ContentStream.Size); P := StrPCopy(P, ContentStream.Text); end; | Ob die Lösung allerdings so schön ist, dass bleibt eine andere Frage...
Gruß Hape!
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
Jakob Schöttl
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: Sa 06.01.07 00:00
naja, vielleicht gehs auch so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var P: Pointer; begin New(p); p^ := TStringStream.Create(toEOF); p^.Assign(ContentStream); end; |
|
|
OZ 
      
Beiträge: 30
|
Verfasst: Sa 06.01.07 00:54
Hallo Jakob,hallo wulfskin,
Danke für die Antworten.
@wulfskin
Warum ist dies unschön? Wie würdest du es anders machen?
@Jakob
An assign habe ich auch gedacht, leider unterstützt dies TStringStream nicht. Hast du noch eine andere Idee?
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: Sa 06.01.07 01:06
Hallo,
ich denke meine Lösung funktioniert. Ich finde sie in sofern unschön, da ich nicht verstehe, warum man das ohnehin schon geladene an einen neuen Speicherplatz kopieren sollte?!
Gute Nacht, jetzt wirklich!
Hape
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
OZ 
      
Beiträge: 30
|
Verfasst: Sa 06.01.07 09:07
Hallo wulfskin,
vielen Dank für die Antwort. Ich versuche mal zu erklären, warum ich die Daten umkopieren muss.
Ich habe eine Schleife, die diese Streams einsammelt.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| ... ContentStream:= TStringStream.Create(toEOF); while ((JobQueue.Joblist.Count>0)) do begin; FURL:=JobQueue.Joblist.Strings[0]; JobQueue.Joblist.Delete(0); IdHTTP.Get(FURL,ContentStream); JobQueue.ThreadResult(ContentStream,Handle); ContentStream.Free; end; ... |
Diese ruft dann die besagte procedure ThreadResult(ContentStream: TStringStream;) auf. Nach jedem Schleifedurchlauf muß ich den ContentStream leeren, sonst konkateniert sich das Ergebnis. Daher muß ich die Daten umkopieren. Falls du einen besseren Vorschlag hast, ich lerne ja noch 
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: Sa 06.01.07 12:06
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| ... ContentStream:= TStringStream.Create(toEOF); while ((JobQueue.Joblist.Count>0)) do begin; FURL:=JobQueue.Joblist.Strings[0]; JobQueue.Joblist.Delete(0); IdHTTP.Get(FURL,ContentStream); JobQueue.ThreadResult(ContentStream,Handle); ContentStream.Free; end; ... | Hallo, muss das Instanzieren von ContentStream nicht innerhalb der Schleife passieren? Spätestens beim zweiten Durchlauf ist ContentStream ja nicht mehr initialisiert...
Ich hab halt überhaupt kein Durchblick was du machen möchtest. Aber in diesem Fall ist es wohl wirklich besser, den Speicher zu kopieren, als so viele Elemente von TStringStream zu haben.
Viele Grüße,
Hape
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
OZ 
      
Beiträge: 30
|
Verfasst: Sa 06.01.07 17:26
Hallo wulfskin,
danke für deine Durchhaltevermögen, trotz der vielen Fragen.
Das mit dem Free in der Schleife habe ich schon gemerkt. War ein Denkfehler.
|
|