![]() |
Stackoverflow bei Übergabe von Parametern (Record) an ein Thread
Hallo,
ich habe folgendes Problem. Ein Packed Record mit der Gesamtbytegröße von 1620000 Bytes. Dieses will ich an ein Threadobjekt übergeben für die weitere Bearbeitung oder wofür auch immer. Ein QT-Beispiel habe ich auch. Sobald ich die Daten übergeben, kommt eine StackOverflow Exception.
Delphi-Quellcode:
Fehler entsteht hier mit besagter Meldung:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs; const maxSatz = 200; type TMyRecord2 = packed record private public MyArray2 : array[1..100] of String[80]; end; PMyRecord = ^TMyRecord; TMyRecord = packed record private public MyArray : array[1..maxSatz] of TMyRecord2; procedure Clear; end; TMyClass = class(TObject) public procedure TestFct(aParam : TMyRecord); end; TMyTask = class(TThread) private tmpMyClass: TMyClass; LokalRec: TMyRecord; protected procedure Execute; override; public Constructor Create (CreateSuspended : Boolean); destructor Destroy; override; procedure SetDaten(aParam: TMyRecord); end; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } tmpTask : TMyTask; tmpRec: TMyRecord; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} //------------------------------------------------------------------------------ procedure TForm1.FormCreate(Sender: TObject); //var // tmpValue: Integer; begin // tmpValue := SizeOf(TMyRecord); // ShowMessage(tmpValue.ToString + ' Bytes'); tmpRec.Clear; tmpTask := TMyTask.Create(True); tmpTask.SetDaten(tmpRec); tmpTask.Start; end; //------------------------------------------------------------------------------ procedure TForm1.FormDestroy(Sender: TObject); begin if Assigned(tmpTask) then FreeAndNil(tmpTask); end; //------------------------------------------------------------------------------ { TMyTask } //------------------------------------------------------------------------------ constructor TMyTask.Create(CreateSuspended: Boolean); begin inherited Create(CreateSuspended); tmpMyClass := TMyClass.Create; LokalRec.Clear; end; //------------------------------------------------------------------------------ destructor TMyTask.Destroy; begin if Assigned(tmpMyClass) then FreeAndNil(tmpMyClass); inherited; end; //------------------------------------------------------------------------------ procedure TMyTask.Execute; begin FreeOnTerminate := False; if Assigned(tmpMyClass) then tmpMyClass.TestFct(LokalRec); end; //------------------------------------------------------------------------------ procedure TMyTask.SetDaten(aParam: TMyRecord); begin LokalRec := aParam; end; //------------------------------------------------------------------------------ { TMyClass } //------------------------------------------------------------------------------ procedure TMyClass.TestFct(aParam: TMyRecord); begin end; //------------------------------------------------------------------------------ { TMyRecord } //------------------------------------------------------------------------------ procedure TMyRecord.Clear; begin FillChar(Self, SizeOf(Self), 0); end; //------------------------------------------------------------------------------ end.
Delphi-Quellcode:
Werden die Daten die übergeben werden, auf dem Stack abgelegt?
procedure TMyTask.SetDaten(aParam: TMyRecord);
Wie würde eure Lösung für sowas aussehen? Grüße Wenn ich die Konstante maxSatz von 200 verringere, dann klappt es ab einem bestimmten Wert. |
AW: Stackoverflow bei Übergabe von Parametern (Record) an ein Thread
Das hat nichts mit dem Thread zu tun, sondern dass dein Record allein größer als der gesamte Stack ist.
Du solltest dir vllt. überlegen ob du so eine große Menge Daten wirklich brauchst oder du legst die Daten auf dem Heap ab und übergibst nur Pointer. |
AW: Stackoverflow bei Übergabe von Parametern (Record) an ein Thread
Versuch es doch mal so:
Delphi-Quellcode:
Nach meinem löchrigen Wissen, wird dann der Stack nicht mit einer unnötigen Kopie der Daten belastet.
procedure TMyTask.SetDaten(const aParam: TMyRecord);
Gruß K-H |
AW: Stackoverflow bei Übergabe von Parametern (Record) an ein Thread
Stimmt, const funktioniert und da ich die Daten darin nicht ändere, reicht mir das so auch.
Grüße |
AW: Stackoverflow bei Übergabe von Parametern (Record) an ein Thread
Zitat:
|
AW: Stackoverflow bei Übergabe von Parametern (Record) an ein Thread
Zitat:
Bliebe die Frage wo sich diese Riesenstruktur nun befindet. Gruß K-H |
AW: Stackoverflow bei Übergabe von Parametern (Record) an ein Thread
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 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 by Thomas Breitkreuz