AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ram voll :-(

Ein Thema von XXcD · begonnen am 6. Jul 2008 · letzter Beitrag vom 7. Jul 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von XXcD
XXcD

Registriert seit: 19. Sep 2006
581 Beiträge
 
Delphi 2007 Professional
 
#1

Ram voll :-(

  Alt 6. Jul 2008, 23:06
Hallo,
beim mehrfachen ausführen folgender Prozedur wird der Speicher immer voller gepackt und dann gibt es nur noch Fehlermeldungen:

Delphi-Quellcode:
procedure TGame.ComboBox1Change(Sender: TObject);
begin
Image2.Picture.Bitmap.LoadFromFile(extractfilepath(paramstr(0))+'\Ressources\images\Player\'+ComboBox1.Text+'.bmp');
Image3.Picture.Bitmap:=split(Image2.Picture.Bitmap, 29, 34, 0, 0);
Image11.Picture:=Image3.Picture;
end;
Habs auch schon so versucht:

Delphi-Quellcode:
procedure TGame.ComboBox1Change(Sender: TObject);
begin
Image2.Picture.Free;
Image2.Picture.Bitmap.LoadFromFile(extractfilepath(paramstr(0))+'\Ressources\images\Player\'+ComboBox1.Text+'.bmp');
Image3.Picture.Bitmap:=split(Image2.Picture.Bitmap, 29, 34, 0, 0);
Image11.Picture:=Image3.Picture;
end;
Das gibt aber schon von anfang an einen Fehler.
Also weiß vielleicht einer wie ich das hinkriege, dass der Speicher immer wieder geleert wird?
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Ram voll :-(

  Alt 6. Jul 2008, 23:08
Delphi-Quellcode:
procedure TGame.ComboBox1Change(Sender: TObject);
begin
Image2.Picture.Free;
Image2.Picture.Bitmap.LoadFromFile(extractfilepath(paramstr(0))+'\Ressources\images\Player\'+ComboBox1.Text+'.bmp');
Image3.Picture.Bitmap:=split(Image2.Picture.Bitmap, 29, 34, 0, 0);
Image11.Picture.Assign(Image3.Picture);
end;
  Mit Zitat antworten Zitat
Benutzerbild von XXcD
XXcD

Registriert seit: 19. Sep 2006
581 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Ram voll :-(

  Alt 6. Jul 2008, 23:11
Hmm das macht keinen Unterschied bleibt genau so.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

Re: Ram voll :-(

  Alt 6. Jul 2008, 23:16
Komisch Liegt das Speicherleck vielleicht an einer anderen Stelle des Programms? Mit FastMM4 oder einem anderen Memory Manager/Checker liesse sich das ganz einfach lokalisieren.

Nachtrag: ups. Da hab ich doch tatsächlich den falschen Code kopiert :ups: Das Image2.Picture.Free gehört da natürlich nicht hin, sonst zieht man dem Programm ja die Arbeitsgrundlage unter den Füssen weg.
  Mit Zitat antworten Zitat
Benutzerbild von XXcD
XXcD

Registriert seit: 19. Sep 2006
581 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Ram voll :-(

  Alt 6. Jul 2008, 23:31
Ja im Taskmanager seh ich ja wie sich der Speicherverbrauch erhöht und immer wenn ich diese Funktion ausführe dann erhöht sich der Speicherverbrauch. Also kann der Fehler nur da liegen. Ich glaube der Fehler liegt genau an dieser Stelle:

Image2.Picture.Bitmap.LoadFromFile(extractfilepath(paramstr(0))+'\Ressources\images\Player\'+ComboBox1.Text+'.bmp');
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#6

Re: Ram voll :-(

  Alt 6. Jul 2008, 23:31
Delphi-Quellcode:
procedure TGame.ComboBox1Change(Sender: TObject);
begin
Image2.Picture.Free; // <--- ich glaub das ist das Problem.

// Versuch mal das hier
Image2.Picture := nil; // <--- intern wird der Rest durch die Setter-Methode der Property geregelt
// [...]
end;
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Ram voll :-(

  Alt 7. Jul 2008, 00:15
Moin Zusammen,

der Setter von Picture ruft intern nur Assign auf also:

Delphi-Quellcode:
Image11.Picture:=Image3.Picture;
// macht das gleiche wie
Image11.Picture.Assign(Image3.Picture);
// man spart nur den Aufruf des Setters
@littleDave:
Wenn man nil zuweist, wird intern, im Prinzip, ein FreeAndNil durchgeführt, also nur wenig mehr als .Free.


Beides gilt für D7 und D2006, wird also in D2005 auch so sein.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#8

Re: Ram voll :-(

  Alt 7. Jul 2008, 00:25
Zitat von Christian Seehase:
@littleDave:
Wenn man nil zuweist, wird intern, im Prinzip, ein FreeAndNil durchgeführt, also nur wenig mehr als .Free.
Beides gilt für D7 und D2006, wird also in D2005 auch so sein.
Das stimmt - intern wird auch nur .Free aufgerufen. Aber wenn man explizit := nil aufruft, weiß die Komponente, dass die Property .Picture gelöscht/resettet werden soll. Wenn man hingegen im Quelltext selber .Picture.Free aufruft, bekommt das die TImage-Komponente afaik nicht mit (vielleicht doch durch ein OnDestryEvent, weiß ich gerade nicht).
Beim direkten aufruf von .Free zeigt der Klassenpointer immer noch auf den alten Speicherbereich, was eigentlich zu einer Zugriffsverletzung führen sollte . Ich würd die := nil-Variante vorziehen, da dann der Rest von der TImage-Komponente erledigt wird (bzw. werden sollte).
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
Benutzerbild von XXcD
XXcD

Registriert seit: 19. Sep 2006
581 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Ram voll :-(

  Alt 7. Jul 2008, 12:36
Ich habe den Fehler gefunden lag an der Funktion Split.
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Ram voll :-(

  Alt 7. Jul 2008, 12:48
Zitat von XXcD:
Ich habe den Fehler gefunden lag an der Funktion Split.
Ist das eine Funkton von Dir oder aus der VCL?
Was war denn falsch?
Vielleicht kann da noch jemand was draus lernen.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 14:40 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