![]() |
Thread und TStringlist
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:
sobald ich jetzt ne stringlist in den Parametern zur Übergabe an den Thread einfüg, erhalte ich ne exception.
type
TParam = record stringlist : TStringlist; ... end; PParam = ^TParam; warum ist das so? und wie kann ich sonst mehrere strings an den thread übergeben? danke schonmal |
Re: Thread und TStringlist
Moin moin,
Zitat:
denke mal, da ist der Fehler zu suchen. |
Re: Thread und TStringlist
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?
|
Re: Thread und TStringlist
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); |
Re: Thread und TStringlist
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. |
Re: Thread und TStringlist
wie sieht denn deine Threadfunktion aus? vielleicht ist ja dort der fehler.
|
Re: Thread und TStringlist
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? |
Re: Thread und TStringlist
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. :) |
Re: Thread und TStringlist
Zitat:
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).
Delphi-Quellcode:
New(Param);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:25 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-2025 by Thomas Breitkreuz