Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Thread und TStringlist (https://www.delphipraxis.net/55971-thread-und-tstringlist.html)

mumu 29. Okt 2005 20:26


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

x000x 29. Okt 2005 21:18

Re: Thread und TStringlist
 
Moin moin,
Zitat:

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.

SirThornberry 29. Okt 2005 21:36

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?

alzaimar 29. Okt 2005 21:39

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);

mumu 29. Okt 2005 22:03

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.

SirThornberry 29. Okt 2005 22:20

Re: Thread und TStringlist
 
wie sieht denn deine Threadfunktion aus? vielleicht ist ja dort der fehler.

mumu 29. Okt 2005 23:20

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?

Ultimator 29. Okt 2005 23:42

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

jbg 30. Okt 2005 07:49

Re: Thread und TStringlist
 
Zitat:

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).

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