AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi TObjectlist: nicht genügend Speicher verfügbar

TObjectlist: nicht genügend Speicher verfügbar

Ein Thema von Antigo · begonnen am 29. Dez 2006 · letzter Beitrag vom 29. Dez 2006
Antwort Antwort
Antigo

Registriert seit: 14. Mär 2005
274 Beiträge
 
#1

TObjectlist: nicht genügend Speicher verfügbar

  Alt 29. Dez 2006, 00:45
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
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 29. Dez 2006, 01:04
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

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

  Alt 29. Dez 2006, 02:55
Schonmal im Taskmanager die Anzahl der GDI Objekte angeschaut? Werden die vllt. immer mehr und der Fehler bezieht sich auf ein ganz anderes Problem?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.169 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 29. Dez 2006, 06:19
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

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

  Alt 29. Dez 2006, 10:44
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.
  Mit Zitat antworten Zitat
Antigo

Registriert seit: 14. Mär 2005
274 Beiträge
 
#6

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

  Alt 29. Dez 2006, 12:34
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 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 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
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

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

  Alt 29. Dez 2006, 12:50
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:23 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