![]() |
Wo ist der Speicherüberlauf??
HI,
ich hab jetzt ein Programm geschrieben, dass ein Bild übertragen soll. Jetzt ist mir im Langzeittest aufgefallen, dass das Programm unmengen Arbeitsspeicher braucht. Nach der Komprimierung nach JPEG ist die Speicherübernutzung zwar nicht weg, aber immer noch da. Nach rund 100 Zugriffen beendet sich das Programm wegen Speicherüberlauf. Ich hab schon versucht alle Variablen zu zerstören, aber das hilft nicht. Quellcode:
Delphi-Quellcode:
Wie sich wohl ahnen lässt, ist das ein Schnipsel aus einer ServerSocket1-ClientRead Prozedur.
Bild := TBitmap.Create;
MS := TMemoryStream.Create; MakeScreenShot(Bild); JPEGBild := TJPEGImage.Create; JPEGBild.CompressionQuality := 90; JPEGBild.Assign(Bild); JPEGBild.Compress; Bild.Destroy; JPEGBild.SaveToStream(MS); JPEGBild.Destroy; MS.Write('ENDE', 4); MS.Position := 0; ServerSocket1.Socket.Connections[0].SendStream(MS); MS.Clear; MS.Destroy; Bild: TBitmap(lokal); MS: TMemoryStream(lokal); JPEGBild: TJPEGImage(lokal); Vielen Dank im Vorraus für eure Hilfe rollstuhlfahrer |
Re: Wo ist der Speicherüberlauf??
Rufe mal anstatt Variable.Destroy --> Variable.Free auf.
Bei Destroy wird afaik kein Speicherplatz freigegeben... |
Re: Wo ist der Speicherüberlauf??
Da denkst du falsch, Lars. Free ruft Destroy auf, falls die Variable nicht nil ist.
@rollstuhlfahrer: Dürfen wir auch MakeScreenShot sehen? |
Re: Wo ist der Speicherüberlauf??
Zitat:
Wie schnell hintereinander rufst du denn den Code auf? |
Re: Wo ist der Speicherüberlauf??
Zitat:
noch besser ist natürlich FreeAndNil(Klasse), dort wird der Objektzeiger noch zusätzlich auf NIL gestellt. wie sieht MakeScreenShot aus? |
Re: Wo ist der Speicherüberlauf??
Zitat:
Beim Code fehlen nicht nur die try/finally Blöcke, sondern wird auch unnötig der Stream geleert bevor er freigegeben wird. Das erinnert mich an folgenden Code:
Delphi-Quellcode:
var
List: TStringList; begin List := TStringList.Create; List.Clear; // Die Liste könnte ja schon nach dem Erzeugen gefüllt sein, man weiß ja nie :-) ... List.Clear; // Es könnte ja sein, dass der Destruktor nur zur Gaudi vorhanden ist. List.Free; end; |
Re: Wo ist der Speicherüberlauf??
klar dürft ihr makescreenshot sehen. er ist von
![]()
Delphi-Quellcode:
rollstuhlfahrer
procedure MakeScreenShot(const ATarget: TBitmap);
var DesktopDC: HDC; begin DesktopDC := CreateDC('DISPLAY', nil, nil, nil); try ATarget.PixelFormat := pfDevice; ATarget.Width := Screen.Width; ATarget.Height := Screen.Height; BitBlt(ATarget.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DesktopDC, 0, 0, SRCCOPY); finally DeleteDC(DesktopDC); end; end; PS: Ich hab jetzt öfter mit dem Fehler: 'Ungültige Zeigeroperation' zu tun |
Re: Wo ist der Speicherüberlauf??
Ich würde einfach mal FastMM reinhängen um zu sehen was der sagt. Evtl. ist ja der Speicherverlust ganz woanders.
|
Re: Wo ist der Speicherüberlauf??
Hast du eventuell irgendwo ein Array, dessen größte du andauernd änderst?
|
Re: Wo ist der Speicherüberlauf??
mal ne ganz dumme frage: wie installiere ich fastMM?
@quendolineDD: In dem Programm gibt es kein einziges Array. rollstuhlfahrer |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz