Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TObjectlist: nicht genügend Speicher verfügbar (https://www.delphipraxis.net/83204-tobjectlist-nicht-genuegend-speicher-verfuegbar.html)

Antigo 29. Dez 2006 00:45


TObjectlist: nicht genügend Speicher verfügbar
 
Hi,
Ich habe in meinem Projekt eine TObjectlist in der ich mehrere Objekte speichere um sie dann zu verwenden.

DIe OBjekte füge ich so hinzu:

Delphi-Quellcode:
Animationen:TObjeclist;

...
...

tempani : Tanimation;
begin
  ...
  ...
  for x:=0 to 8 do
   for y:=0 to 8 do
     if spiel.sdk.feld[x,y]<>0 then begin
       tempani:=Tanimation.create(bmp2.Canvas.Pixels[spiel.feldbreite*x+(spiel.feldbreite div 2),
                                                   spiel.feldbreite*y+(spiel.feldbreite div 2)],
                                                   bmp.Canvas.Pixels[spiel.feldbreite*x+(spiel.feldbreite div 2),
                                                   spiel.feldbreite*y+(spiel.feldbreite div 2)],
                                                   3,
                                                   point(x,y));
     Animationen.add(Tempani);

dann hab ich einen timer in dem ich die Objekte bearbeite:


Delphi-Quellcode:
procedure TForm1.AnimationstimerTimer(Sender: TObject);
var i ,x,y: integer;
begin
i:=0;
while (i < Animationen.Count) do
  begin

    inc((Animationen[i] as TAnimation).index);

    if (Animationen[i] as TAnimation).index > animation.anzfarbe then begin Animationen.Delete(i); dec(i); end
    else begin
      //tue dies und das
    end;

    inc(i);
  end;

  if animationen.Count=0 then begin
     //ebenso dies und das
      Animationstimer.Enabled:=false;
  end;


end;
SO mein Problem ist, dass wenn ich öfters hintereinander die obere Prozedur ausführe ich einen haufen Fehlermeldungen bekomme. Und zwar steht auf allen folgendes: "Für diesen Befehl ist nicht genügend Speicher verfügbar". Ich hab daher die vermutung das irgendwo speicherüberreste von den gelöschten Objekten der Liste übrig bleiben. Ich hab aber eigentlich gedacht, dass sich die Tobjectliste um alles kümmert und man selber nichts mehr weiter tun muss ausser delete auszuführen.

Hat jemand eine Ahnung was hier falsch läuft?


danke schonmal im vorraus :)

Luckie 29. Dez 2006 01:04

Re: TObjectlist: nicht genügend Speicher verfügbar
 
Hast du auch OwnsObjects auf True gesetzt? Denn nur dann kümmert sich die ObjektListe um das Freigeben der Objekte. Ansonsten bist du dafür verantwortlich.

Muetze1 29. Dez 2006 02:55

Re: TObjectlist: nicht genügend Speicher verfügbar
 
Schonmal im Taskmanager die Anzahl der GDI Objekte angeschaut? Werden die vllt. immer mehr und der Fehler bezieht sich auf ein ganz anderes Problem?

Bernhard Geyer 29. Dez 2006 06:19

Re: TObjectlist: nicht genügend Speicher verfügbar
 
Häng doch mal FastMM in dein Projekt.

Entweder du hast massig Speicherlöcher oder du rauscht in das Fragmentierungsproblem des normalen Speichermanager von D < 2006. Dort denkt dann die interne Speicherverwaltung das kein Speicher mehr frei ist obwohl das Programm nur wengi Speicher verwendet.

jbg 29. Dez 2006 10:44

Re: TObjectlist: nicht genügend Speicher verfügbar
 
Zitat:

Zitat von Bernhard Geyer
oder du rauscht in das Fragmentierungsproblem des normalen Speichermanager von D < 2006.

Also ich denke nicht, dass er mit so vielen kleinen Objekten der gleichen Größe (TAnimation) in das Fragmentierungsproblem reinläut.

Kommt die Programmausführung überhaupt in die Animationen.Delete-Zeile? Wenn nicht, dann hast du ein Speicherleck bis zum Freigeben/Leeren der Animationen-Liste (vorausgesetzt du hast den Default-Parameter "OwnsObjects" von TObjectList nicht auf False gesetzt).

Übrigens ist die Pixels[] Eigenschaft der Canvas nicht gerade schnell. Besser (aber noch nicht das non-plus-ultra => Scanlines) ist es, das Canvas.Handle zuwischenzuspeichern und dann mittels GetPixel(dc, x, y) dir die Farben zu holen.

Antigo 29. Dez 2006 12:34

Re: TObjectlist: nicht genügend Speicher verfügbar
 
Zitat:

Zitat von Luckie
Hast du auch OwnsObjects auf True gesetzt? Denn nur dann kümmert sich die ObjektListe um das Freigeben der Objekte. Ansonsten bist du dafür verantwortlich.

daran lags scheinbar nicht. Bekomme jetzt die Fehlermeldung EOutofRessources.



Zitat:

Zitat von Muetze1
Schonmal im Taskmanager die Anzahl der GDI Objekte angeschaut? Werden die vllt. immer mehr und der Fehler bezieht sich auf ein ganz anderes Problem?

ok :oops: daran scheint es tatsächlich zu liegen. Das Problem liegt scheinbar beim zeichnen meines SPielfeldes, Wenn ich das oft ausführe (indem ich die Form beispielsweise hinter den Taskmanager und zurückschiebe, geht die Anzahl der GDI Objekte immer höher und das Teil stürzt ab. Auch ohne den Animationstimer. Mal gucken ob ich da was finde, sonst poste ich mal etwas Code.

edit: ok ein simples temp.destroy; in der zeichenprozedur hat das ganze gelöst :) vielen dank euch allen :)

jbg 29. Dez 2006 12:50

Re: TObjectlist: nicht genügend Speicher verfügbar
 
Zitat:

Zitat von Antigo
ein simples temp.destroy;

Schon mal was davon gehört, dass man Destroy nicht direkt aufrufen soll? (Einfach mal Destroy eingeben und dann F1 drücken)

Zitat:

Klasse
TObject

Syntax
destructor Destroy();

Beschreibung
Rufen Sie Destroy nicht direkt auf. Verwenden Sie stattdessen Free . Die Methode Free überprüft, ob die Objekt-Referenz nicht bereits nil ist und ruft Destroy nur bei Bedarf auf.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 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