Einzelnen Beitrag anzeigen

Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#1

Stackoverflow bei Übergabe von Parametern (Record) an ein Thread

  Alt 8. Aug 2016, 12:31
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:
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.
Fehler entsteht hier mit besagter Meldung:
procedure TMyTask.SetDaten(aParam: TMyRecord); Werden die Daten die übergeben werden, auf dem Stack abgelegt?
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.
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat