AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Stackoverflow bei Übergabe von Parametern (Record) an ein Thread
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Alex_ITA01 · begonnen am 8. Aug 2016 · letzter Beitrag vom 8. Aug 2016
Antwort Antwort
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, 13: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
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

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

  Alt 8. Aug 2016, 13:39
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General ( 8. Aug 2016 um 13:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

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

  Alt 8. Aug 2016, 13:39
Versuch es doch mal so:
procedure TMyTask.SetDaten(const aParam: TMyRecord); Nach meinem löchrigen Wissen, wird dann der Stack nicht mit einer unnötigen Kopie der Daten belastet.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Alex_ITA01

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

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

  Alt 8. Aug 2016, 13:43
Stimmt, const funktioniert und da ich die Daten darin nicht ändere, reicht mir das so auch.

Grüße
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

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

  Alt 8. Aug 2016, 17:15
Stimmt, const funktioniert und da ich die Daten darin nicht ändere, reicht mir das so auch.
Und falls doch, nimm einfach einen Pointer auf das entsprechende Struct. Eventuell funktioniert es sogar mit var statt const.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

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

  Alt 8. Aug 2016, 18:42
Stimmt, const funktioniert und da ich die Daten darin nicht ändere, reicht mir das so auch.
Und falls doch, nimm einfach einen Pointer auf das entsprechende Struct. Eventuell funktioniert es sogar mit var statt const.
Soweit ich weiß sind var und const nur Mäntelchen um Pointer vor den Augen des Programmierers zu verbergen, mit Schreibschutz ein/aus.
Bliebe die Frage wo sich diese Riesenstruktur nun befindet.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

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

  Alt 8. Aug 2016, 21:00
Soweit ich weiß sind var und const nur Mäntelchen um Pointer vor den Augen des Programmierers zu verbergen, mit Schreibschutz ein/aus.
Bliebe die Frage wo sich diese Riesenstruktur nun befindet.
Genau. Demnach sollte ein var also ebenso gut funktionieren, wie ein const. Wenn die Struktur auf dem Heap liegt, juckt das ja niemanden. Hauptsache nicht auf dem Stack.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort


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