Autor Beitrag
OZ
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: 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)?

ausblenden 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; //<-- Ich weiß, daß dies falsch ist!
  FResultlist.Add(p);


Danke!
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Fr 05.01.07 23:51 
Hallo,

dass machst du indem du nicht den Zeiger kopierst, sondern den Inhalt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  P: Pointer;
begin
  GetMem(P, ContentStream.Size);
  P := StrPCopy(P, ContentStream.Text); // aus dem Kopf, weiss net wie rum die Parameter sein müssen...
                                        // vielleicht fehlt auch die Größe
                                        // move geht natürlich auch...
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Sa 06.01.07 00:00 
naja, vielleicht gehs auch so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
  P: Pointer;
begin
  New(p);
  p^ := TStringStream.Create(toEOF);
  p^.Assign(ContentStream);
end;
OZ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: 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.
ausblenden 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 :D
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Sa 06.01.07 12:06 
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: 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.