Nicht genügend Speicher Verfügbar [gelöst]

Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Nicht genügend Speicher Verfügbar [gelöst]

Beitrag von corpsman »

Servus,

Ich bastle gerade an einem Kleinen Programm, welches hier und da ein paar Threads erzeugt. Es werden Levels geladen, und je nach level werden es mehr oder weniger Threads.

Unter Linux kann ich ein Level Laden, welches mir unter Windows nen Fehler bringt. und zwar genau

Code: Alles auswählen

 
 
TPartikelengine = Class(TThread) // Attention you need to activate Threads in Linux Applications.
..
Constructor TPartikelengine.Create;
Begin
  Inherited create(false);
.. Hier..
 


Die Meldung lautet in etwa

Exception-Klasse EThread Für diesen Befehl ist nicht genügend Speicher Verfügbar


Klar meine Anwendung hat nicht genug speicher, Laut Taskmanager passiert das bei ca. 64MB Speichernutzung, das ist auf meinem System (16 GB) natürlich nicht mal annähernd problematisch.

Heap und Stack stehen auf "Default" = 0, jemand ne Idee mit welchen Werten man das typisch vorbelegen sollte ? Ich dachte ja immer, dass der Heap frühestens bei 2GB überläuft...
Zuletzt geändert von corpsman am Mo 4. Aug 2014, 06:59, insgesamt 1-mal geändert.
--
Just try it

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Nicht genügend Speicher Verfügbar

Beitrag von Michl »

Wahrscheinlich ist eher die Anzahl der Threads maßgeblich. Einen ähnlichen Fehlertext bekomme ich unter Win7 bei 119 Threads ausgegeben, wenn ich das Beispiel vom Bugtracker ausführe: http://bugs.freepascal.org/view.php?id=13105
oder auch http://bugs.freepascal.org/view.php?id=17755

Wenn ich mit -Cs$100000 kompiliere kann ich dann fast 2000 Threads erzeugen (auch einstellbar unter Projekteinstellungen -> Kompilieren und Linken -> Heap- und Stackgrößen).

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Nicht genügend Speicher Verfügbar

Beitrag von corpsman »

*g*

das wird es sein, kanns leider erst wieder am mo testen, sag gibts ne möglichkeit, das im Code zu machen, dann kann ich es plattform abhängig mit nem Define regeln ?
--
Just try it

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Nicht genügend Speicher Verfügbar

Beitrag von Michl »

K.A., normalerweise sollte man beim Erstellen des Threads die Stackgröße übergeben können (http://www.freepascal.org/docs-html/rtl/classes/tthread.create.html). Wenn ich das richtig gelesen habe funktioniert das allerdings unter Windows nicht (habs auch mal getestet, bei mir geht das auch nicht so einfach). Zitat:
You can set thread stack size by specifying it in TThread constructor; but as far as i know; on Windows it does not work as expected. and to get desired effect you should take a look at this article: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453(v=vs.85).aspx , pay attention to STACK_SIZE_PARAM_IS_A_RESERVATION thing... So the problem is that TThread from FPC RTL does not set thread size on Windows.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Nicht genügend Speicher Verfügbar

Beitrag von corpsman »

Danbke Michl,

es funktioniert wunderbar.

Übrigens im Code geht auch :

Code: Alles auswählen

 
// http://www.freepascal.org/docs-html/prog/progsu102.html
{$IFDEF Windows}
{$MAXSTACKSIZE $100000}
{$ENDIF} 
 
--
Just try it

Antworten