AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Verwendeter Arbeitsspeicher wird immer mehr...
Thema durchsuchen
Ansicht
Themen-Optionen

Verwendeter Arbeitsspeicher wird immer mehr...

Ein Thema von DarkLink · begonnen am 20. Jun 2009 · letzter Beitrag vom 20. Jun 2009
Antwort Antwort
Seite 1 von 2  1 2      
DarkLink

Registriert seit: 13. Nov 2005
5 Beiträge
 
RAD-Studio 2009 Arc
 
#1

Verwendeter Arbeitsspeicher wird immer mehr...

  Alt 20. Jun 2009, 12:19
Hallo,

ich hoffe meine Frage ist im richtig Forum.

Ich habe folgendes Problem: Ich habe ein Programm geschrieben, welches mir auf dem Display meiner Logitech G15 Tastatur verschiedene Werte, wie Uhrzeit, Uptime, etc. anzeigt. Das Funktioniert auch alles soweit ganz gut, bis auf einen kleinen Haken. Das Programm belegt nach einiger Zeit meinen kompletten Arbeitsspeicher. Man kann den Anstieg ist im Task Manager mit ansehen, obwohl es nur wenige kB pro Sekunde sind, aber wie sagt man so schön "Kleinvieh macht auch Mist".

Das Interessante an der ganzen Sache ist, dass dieses Phänomen nur dann auftritt, wenn ich die Anwendung ohne Debugger starte, also ausserhalb der IDE. Wenn der Programmaufruf aus der IDE erfolgt, bleibt die Speichernutzung bei angenehmen 1280 kB.

Um die Ausgabe zu erzeugen, habe ich mir eine Bitmap-Variable angelegt, welche ich durch einen Timer jede Sekunde, zuerst mit Bitmap.Create initialisiere, dann mit den Canvas Methoden bearbeite, anschließend auf das Display übertrage und dann mit Destroy wieder zerstöre. Ich hatte mir jetzt also gedacht, dass das Programm die gleiche Variable immer wieder neu belegt und anschließend wieder leert und somit nicht immer mehr Speicher frisst, sondern den verwendeten wieder frei gibt, oder ist das mein Denkfehler ?

Falls mal jemand über den Quellcode schauen will, habe ich ihn mal in den Anhang meines Postings gesteckt.

Ich hoffe ihr könnt mir weiterhelfen.

Gruß
Michael
Angehängte Dateien
Dateityp: rar lcdclock_144.rar (562,8 KB, 16x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#2

Re: Verwendeter Arbeitsspeicher wird immer mehr...

  Alt 20. Jun 2009, 12:24
Was spricht denn dagegen, das Bitmap am Start der Anwendung zu Erstellen, dann immer wieder da Canvas zu beschreiben, und anschließend bei programmende alles wieder frei zu geben?

Eventuell hilft das ja..
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
DarkLink

Registriert seit: 13. Nov 2005
5 Beiträge
 
RAD-Studio 2009 Arc
 
#3

Re: Verwendeter Arbeitsspeicher wird immer mehr...

  Alt 20. Jun 2009, 12:27
Erstmal danke für die schnelle Antwort.

Zuerst hatte ich das auch so... nur da hatte ich das mit dem Speicherproblem genauso. Deswegen bin ich ja erst auf die Idee gekommen das Bitmap immer wieder neu zu initialisieren.

EDIT:

OK, ich muss mich entschuldigen...
Das mit dem immer wieder neu zeichnen hatte ich in einer alten Version meines Programms gemacht, da war es dann wohl etwas anderes, das dafür gesorgt hat, dass der Speicher volläuft.
Um es kurz zu fassen, wenn ich es so mache läuft es.... vielen vielen Danke.

EDIT2:

Gut, zu früh gefreut. Der Speicher nimmt immernoch zu...
  Mit Zitat antworten Zitat
Benutzerbild von Dunkel
Dunkel

Registriert seit: 26. Mär 2007
Ort: Klingenstadt
541 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Verwendeter Arbeitsspeicher wird immer mehr...

  Alt 20. Jun 2009, 12:44
Zitat von DarkLink:
{...} und dann mit Destroy wieder zerstöre.
btw. gibt man Objekte mit .Free oder FreeAndNil() frei. Der Destructor sollte nie explizit aufgerufen werden.
Es ist zu wahr um schön zu sein...
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Verwendeter Arbeitsspeicher wird immer mehr...

  Alt 20. Jun 2009, 12:44
Hallo,

benutze memcheck oder fastmm4.

Ausserdem sind ein paar Warnungen im Programm.
Die würde ich zuerst mal beheben.

Update:
Ist lcdg15.pas von dir ?

Ersetze mal Bildschirm.Destroy; durch Bildschirm.Free,
und zwar jede Stelle ! (FormCreate, OnTimer)

Ausserdem würde ich try finally benutzen.


Heiko
Heiko
  Mit Zitat antworten Zitat
DarkLink

Registriert seit: 13. Nov 2005
5 Beiträge
 
RAD-Studio 2009 Arc
 
#6

Re: Verwendeter Arbeitsspeicher wird immer mehr...

  Alt 20. Jun 2009, 13:08
Ich habe jetzt mal fastmm4 benutzt, dennoch wird mein Programm immernoch stetig größer, und bei mir wird nicht eine Warnung angezeigt.

Nein, lcdg15.pas ist nicht von mir.
Das mit dem Destroy habe ich schon geändert, aber immernoch das selbe Problem.

Irgendwie versteh ich langsam die Welt nicht mehr...
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Verwendeter Arbeitsspeicher wird immer mehr...

  Alt 20. Jun 2009, 13:13
Hallo,

Zitat:
Ich habe jetzt mal fastmm4 benutzt, dennoch wird mein Programm immernoch stetig größer, und bei mir wird nicht eine Warnung angezeigt.
Wie hast du fastmm4 konfiguriert, dass es nach Lecks suchen soll ?

Mache doch einfach mal.
Schreibe in InitBitmap doch mal

Delphi-Quellcode:
  Bild := TBitmap.Create;
  Bild := TBitmap.Create;
also auf jeden Fall ein Leck rein.
Das muesste er nach Programm-Ende anzeigen


hänge das Projekt mit deinem Änderungen noch mal an
das erste Posting an.
Schon mal mit memcheck probiert.
Finde ich einfacher.

Zum Destroy -> Free
Du hast hoffentlich alle deine Destroys ersetzt ?
(Keyboard.Destroy ... lungert hier auch noch rum)


Ausserdem rufst du im ResumeSuspend FormCreate auf, warum ?
Das erzeugt wieder eine Bitmap.

Mache mal deinen Code etwas übersichtlicher
(mehr Methoden).





Heiko
Heiko
  Mit Zitat antworten Zitat
DarkLink

Registriert seit: 13. Nov 2005
5 Beiträge
 
RAD-Studio 2009 Arc
 
#8

Re: Verwendeter Arbeitsspeicher wird immer mehr...

  Alt 20. Jun 2009, 13:51
Hallo,

Zitat von hoika:
Wie hast du fastmm4 konfiguriert, dass es nach Lecks suchen soll ?
Habe es zuerst nicht so richtig verstanden, wie fastmm genau funktioniert. Auf jeden fall habe ich jetzt Memory Leaks gefunden, jedoch weiß ich mit der Aussage wer die Leaks verursacht nicht viel anzufangen.

Zitat von hoika:
hänge das Projekt mit deinem Änderungen noch mal an
das erste Posting an.
Hab ich gemacht.

Zitat von hoika:
Schon mal mit memcheck probiert.
Finde ich einfacher.
Funkioniert aber leider unter Delphi 2009 nicht mehr.

Zitat von hoika:
Zum Destroy -> Free
Du hast hoffentlich alle deine Destroys ersetzt ?
(Keyboard.Destroy ... lungert hier auch noch rum)
Hab ich gemacht, siehe neue Version.

Zitat von hoika:
Ausserdem rufst du im ResumeSuspend FormCreate auf, warum ?
Das erzeugt wieder eine Bitmap.
Das war noch ein überbleibsel aus der alten Version die ich erwähnte, hab die Funktion einfach von dort kopiert, ohne nochmal genauer drüber zu schauen. Danke für den Hinweis.

Zitat von hoika:
Mache mal deinen Code etwas übersichtlicher
(mehr Methoden).
Ich weiß, das ist eine meiner großen schwächen, den Code übersichtlich zu gestalten. Nur meistens ist das kein Problem, da der Code nur für mich bestimmt ist...

Gruß
Michael
Miniaturansicht angehängter Grafiken
leaked_memory_182.jpg  
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Verwendeter Arbeitsspeicher wird immer mehr...

  Alt 20. Jun 2009, 15:12
Hallo,

Zitat:
jedoch weiß ich mit der Aussage wer die Leaks verursacht nicht viel anzufangen.
In deinem jpg steht doch genau drin,
was du im fastmm4 definieren sollst ???

FullDebugMode
LogMemoryLeakDetailFile

Setze das anständig und poste die Datei.

In der Inc steht
{.$define FullDebugMode}

Ändere das in
{$define FullDebugMode}

usw.


Heiko
Heiko
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: Verwendeter Arbeitsspeicher wird immer mehr...

  Alt 20. Jun 2009, 15:24
Hallo,

setze mal das Timer-Intervall testweise auf 5000 (5 Sekunden),
vielleicht braucht die Timer-Methode mehr als 1 Sekunde ?

Ausserdem würde ich mal die globalen Variablen durch lokale ersetzen.


Heiko
Heiko
  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 21:35 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