AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Thread und TStringlist

Ein Thema von mumu · begonnen am 29. Okt 2005 · letzter Beitrag vom 30. Okt 2005
Antwort Antwort
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#1

Thread und TStringlist

  Alt 29. Okt 2005, 21:26
ich erstelle einen threads mit beginthread (nicht mit dem VCL Thread Object)

Delphi-Quellcode:
var
 _Param: PParam;

GetMem(_Param, SizeOf(TParam));
...
_thread_handle := BeginThread(nil,
                              0,
                              Addr(ThreadFunction),
                              _Param,
                              0,
                              id);
Delphi-Quellcode:
type
  TParam = record
    stringlist : TStringlist;
    ...
  end;
  PParam = ^TParam;
sobald ich jetzt ne stringlist in den Parametern zur Übergabe an den Thread einfüg, erhalte ich ne exception.

warum ist das so? und wie kann ich sonst mehrere strings an den thread übergeben?

danke schonmal
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Thread und TStringlist

  Alt 29. Okt 2005, 22:18
Moin moin,
Zitat von mumu:
Delphi-Quellcode:
var
_Param: PParam;

GetMem(_Param, SizeOf(TParam));
...
_thread_handle := BeginThread(nil,
                              0,
                              Addr(ThreadFunction),
                              _Param,
                              0,
                              id);
... sobald ich jetzt ne stringlist in den Parametern zur Übergabe an den Thread einfüg, erhalte ich ne exception...
wie fügst du denn die Stringliste den _Param hinzu? Der Teil von deinem Post mit den Punkten interessiert hier,
denke mal, da ist der Fehler zu suchen.
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Thread und TStringlist

  Alt 29. Okt 2005, 22:36
du gibst nach dem BeginThread aber nicht zufällig den Record wieder frei? Denn dann wäre er zu beginn des Thread eventuell schon wieder freigegeben. Und legst du eine Instanz der Stringliste an?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Thread und TStringlist

  Alt 29. Okt 2005, 22:39
Du alloziierst Speicher, um einen Zeiger auf ein Objekt zu halten. Das Objekt selbst(die TStringList) wird gar nicht erzeugt. DA ist der Fehler.

Delphi-Quellcode:
var
_Param: PParam;

GetMem(_Param, SizeOf(TParam));
_Param^.Stringlist := TStringList.Create; // <---------------
_thread_handle := BeginThread(nil,
                              0,
                              Addr(ThreadFunction),
                              _Param,
                              0,
                              id);
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#5

Re: Thread und TStringlist

  Alt 29. Okt 2005, 23:03
hmm nee, allein schon, wenn ich gar nix mach, und die stringlist im record nil ist, krieg ich ne exception.

nur wenn ich aus dem record die stringlist rausnehm gehts. auch wenn ich absolut nix mit der mach.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Thread und TStringlist

  Alt 29. Okt 2005, 23:20
wie sieht denn deine Threadfunktion aus? vielleicht ist ja dort der fehler.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#7

Re: Thread und TStringlist

  Alt 30. Okt 2005, 00:20
hmm lag doch nicht an der stringlist.

ich hab in meinem record nen string ohne längenangabe gehabt.

kann mir vielleicht jemand sagen, warum man unbedingt beim string die länge angeben muss, damit das hinhaut?
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Thread und TStringlist

  Alt 30. Okt 2005, 00:42
Naja, wenn du nicht angibst, welche Länge ein String hat, dann weißt du ja nicht, wieviel Speicher er belegt.
Also gibst du die maximale Zeichenzahl an, und je nachdem wie viele du wählst wird die benötigte Anzahl Bytes zur Speicherung verwendet.
Julian J. Pracht
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

Re: Thread und TStringlist

  Alt 30. Okt 2005, 08:49
Zitat von Ultimator:
Naja, wenn du nicht angibst, welche Länge ein String hat, dann weißt du ja nicht, wieviel Speicher er belegt.
Das ist nicht das Problem, denn in diesem Fall wird ein AnsiString benutzt und der ist nur ein Zeiger.

Das eigentliche Problem ist, dass hier GetMem anstatt New (und wahrscheinlich FreeMem statt Dispose) aufgerufen wird. Dadurch wird dem Compiler die Möglichkeit genommen den AnsiString zu verwalten (dieser besitzt einen Referenzzähler den der Compiler verwaltet).

New(Param);
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 08:19 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