Autor Beitrag
klausiemausie
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

Win XP, Win Vista Ultimate
Delphi 6
BeitragVerfasst: So 08.02.09 09:59 
so nun endlich habe ich mein programm fertig, aber es verbraucht zu viel arbeitsspeicher, nämlich über 400 mb ram, das is für so ein relativ kleines programm sehr viel. worauf sollte man denn achten, bzw. was sollte man ändern, um den speicherverbrauch zu senken?
gruss klaus
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: So 08.02.09 10:15 
Naja, das kommt ganz darauf an, was dein Programm so macht. Hast du viele große Bilder drin? Gibst du zwischendurch benötigten Speicher wieder frei? Hast du evtl. viele Konstrukte der Form Setlength(MeinArray, length(MeinArray) + 1) drin, die sehr oft aufgerufen werden?

_________________
We are, we were and will not be.
klausiemausie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

Win XP, Win Vista Ultimate
Delphi 6
BeitragVerfasst: So 08.02.09 10:37 
viele bilder habe ich drin, aber das sind alles pngs, die nich grösser sind als 10 kb oder so. arrays hab ich einige drin ja, aber von speicherfreigabe weiss ich nichts, wie macht man das, wie gehts das, diese struktur die du da angegeben hast, hab ich nicht verwendet in meinem programm
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: So 08.02.09 10:46 
PNG oder JPG ist völlig egal - wenn du die Bilder lädst, in ein Image z.B., dann sind das (oft) intern Bitmaps und verbrauchen entsprechend viel Platz.

Speicher freigeben: Ganz grob muss zu jedem Create auch ein Free in deinem Code vorkommen.

_________________
We are, we were and will not be.


Zuletzt bearbeitet von Gausi am So 08.02.09 10:47, insgesamt 1-mal bearbeitet
uko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220
Erhaltene Danke: 1

Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
BeitragVerfasst: So 08.02.09 10:47 
Du mußt jedes Objekt, das Du erzeugst auch wieder freigeben. Sonst bleibt der Speicher dafür bis zum Programmende einfach reserviert.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
myObject := TMyObject.Create; // Speicher für myObject wird reserviert
try
 //mach wasmit myObject
finally
  myObject.Free;  // Speicher wird wieder freigegeben
end;

Einfachster Weg: aktuelle Version von FastMM manuell einbinden und die Überwachung des Speicherverbrauchs einschalten. Dann kriegst Du schon gesagt, wo Du Speicher nicht freigibst :-)

Außerdem schau mal nach so Sachen wie:
ausblenden Delphi-Quelltext
1:
2:
var
  myarray = array[0..1000000of double;


(sprich nach vordefinierten arrays großer Dimension. Wenn Du sie nicht wirklich in der Dimension brauchst, dann sind meistens die dynamischen Arrays die bessere Wahl)

Grüße,
Uli
klausiemausie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

Win XP, Win Vista Ultimate
Delphi 6
BeitragVerfasst: So 08.02.09 11:58 
hm gut liegt bestimmt daran, dass alle meine über 30 forms am anfang per create form geladen werden, nur eben nicht angezeigt werden, wie löse ich denn das am galantesten? ich könnte ja in der projektunit das alles rausmachen, bloss wie schreibe ich dass dann in die einzelnen units, wenn eine neue form aufgerufen werden soll, dass die dann geladen wird, und wenn die wieder beendet wird, dass die dann halt ganz verschwindet?
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: So 08.02.09 12:46 
Du nimmst zuerst die genzen Nebenformen aus den automatisch erzeugten heraus (in den Projektoptionen). Und überall da, wo du ein
ausblenden Delphi-Quelltext
1:
NebenForm.Show; // oder ShowModal					
aufrufst, schreibst du sowas:
ausblenden Delphi-Quelltext
1:
2:
3:
if Not Assigned(NebenForm) then
    Application.CreateForm(TNebenForm, NebenForm);
NebenForm.Show;

_________________
We are, we were and will not be.
klausiemausie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

Win XP, Win Vista Ultimate
Delphi 6
BeitragVerfasst: So 08.02.09 13:39 
ah gut, und wie schreib ich dann dass das fenster wieder verschwindet und der speicher freigegeben wird?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 08.02.09 14:49 
Setz im OnClose des Formulars Action auf caFree, dann wird dieses beim Schließen aus dem Speicher entfernt.

user profile iconklausiemausie hat folgendes geschrieben Zum zitierten Posting springen:
hm gut liegt bestimmt daran, dass alle meine über 30 forms am anfang per create form geladen werden
Aber 30 Formulare? Selbst Projekte von mir, die nicht die allerkleinsten sind, haben deutlich weniger. Z.B. hat eines bei dem ich gerade geschaut habe 94 Units und ca. 45.000 Zeilen Quelltext, aber nur 14 Formulare.

Bist du sicher, dass du das nicht auf weniger zusammenfassen kannst? Machen die Formulare wirklich alle vollkommen verschiedene Sachen?

Die Speicherverwendung wird aber vermutlich eher an Multimediainhalten liegen, ob wie bereits angesprochen Bilder oder andere Sachen.