Helau zusammen
ich hab ein relativ triviales Problem mit einem Memo.
Auf der Basis von einem LNet-Beispiel hab ich ein einfaches Prog geschrieben, bei dem von einer Steuerung einfach Klartextmeldungen in ein Memo geschrieben werden. Wie in einem einfachen Terminalprogramm. Nur erweitert um Datum und Uhrzeit des Empfangs der Nachricht (über TCP/IP).
Nach 1000 Zeilen soll die älteste Nachricht weggeworfen und die neue dazugehängt werden.
Ich hab das genau so gemacht wie im LNet-Beispiel, das eigentlich mit dem Memo das gleiche tut, halt ohne Datum und Zeit.
Das funzt alles auch so wie gedacht, bis auf den belegten Speicher.
Wenn die Steuerung ordentlich Daten sendet, belegt das Programm irgendwann mal soviel Speicher, das es zu Speichermangel kommt.
Wenn ich die aktuellen Memotext.Lines.Count anzeigen lasse, stehen hier immer maximal die 1000 drin.
Mit Memotext.Lines.Delete(0) wird immer die älteste Zeile gelöscht.
mit MemoText.Append(Zeile) wird dann die neue Zeile angefügt.
Aber irgendwie wird vermutlich der Speicher der alten Zeile nicht mehr freigegeben. LNet hat in seinem Beispiel das gleiche Problem.
Aber da das nur ein Beispiel ist, hat das keine längere Laufzeit, wo das vorkommen kann.
Wie kann ich diesen Speicherüberlauf verhindern, oder ist das in einem Momo einfach so?
Ich hab im Net absolut nichts gefunden, außer mehreren Leute mit dem gleichen Problem, aber genau so ohne Lösung.
Hat jemand eine Idee?
Danke schon mal
NoCee
Memo Speicher freigeben
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Memo Speicher freigeben
Kann es sein, dass Objekte an die Zeile gebunden werden?
Z.B. dass du die Zeile per Memo1.Lines.AddObject(...) hinzufügst? es könnte aber auch an Append liegen. Nutze mal einfach nur Memo1.lines.Add(...) sollte das gleiche machen.
Delete(0) löscht immer die erste Zeile wärens Memo1.lines.add immer zu letzten Zeile eine hinzugefügt. Daher hast du den Gewünschten Effekt.
Z.B. dass du die Zeile per Memo1.Lines.AddObject(...) hinzufügst? es könnte aber auch an Append liegen. Nutze mal einfach nur Memo1.lines.Add(...) sollte das gleiche machen.
Delete(0) löscht immer die erste Zeile wärens Memo1.lines.add immer zu letzten Zeile eine hinzugefügt. Daher hast du den Gewünschten Effekt.
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 174
- Registriert: Do 3. Mär 2011, 21:34
- OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
- CPU-Target: Intel 32/64Bit, ARM9
- Wohnort: Ulm
Re: Memo Speicher freigeben
Danke mal für die prompte Antwort.
memo.lines.add oder
memo.append verändern da bei mir nix.
Ich hab versuchshalber aber mal einen Winzling geschrieben der nur ein Memo und einen Button hat. Bei onClick hängt der einfach 1000
Zeilen an und löscht das Memo wieder komplett.
Dieses einfache Prog hat das gleiche Problem wie ich anfangs beschrieben habe.
Und jetzt der Hammer: Wenn ich Memo1.SelStart ... wegkommentiere, ist alles so wie es sein soll.
Ich hab das dann in meinem Prog auch auskommentiert und das tut was es soll. Läuft seit Stunden ohne Probleme.
Ich hab das SelStart auch nur aus dem LNet-Beispiel übernommen. Die Funktion brauch ich aber eigentlich nicht.
Nachteil der ganzen Verbesserung: Ich steh noch mehr auch dem Schlauch als vorher.
Vielleicht weiß ja jemand was passiert. Ich hab da im Net nichts gefunden.
Gruß
NoCee
memo.lines.add oder
memo.append verändern da bei mir nix.
Ich hab versuchshalber aber mal einen Winzling geschrieben der nur ein Memo und einen Button hat. Bei onClick hängt der einfach 1000
Zeilen an und löscht das Memo wieder komplett.
Dieses einfache Prog hat das gleiche Problem wie ich anfangs beschrieben habe.
Und jetzt der Hammer: Wenn ich Memo1.SelStart ... wegkommentiere, ist alles so wie es sein soll.

Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
for i:=0 to 1000 do
begin
Memo1.lines.add('Stx_xxxxxxxxxxxxxxxxxxxxxxxEtx_');
//Form1.Memo1.SelStart := Length(Form1.Memo1.Lines.Text);
end;
Form1.Memo1.clear;
end;
Ich hab das SelStart auch nur aus dem LNet-Beispiel übernommen. Die Funktion brauch ich aber eigentlich nicht.
Nachteil der ganzen Verbesserung: Ich steh noch mehr auch dem Schlauch als vorher.
Vielleicht weiß ja jemand was passiert. Ich hab da im Net nichts gefunden.
Gruß
NoCee
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Memo Speicher freigeben
Hallo,
ich habe gerade dein wunderbares Minimalbeispiel bei mir nachgebaut, aber bei mir wurde laut der Unit heaptrc jeder Speicher auch wieder freigegeben.
Daher meine Ratschläge:
ich habe gerade dein wunderbares Minimalbeispiel bei mir nachgebaut, aber bei mir wurde laut der Unit heaptrc jeder Speicher auch wieder freigegeben.
Daher meine Ratschläge:
- Update auf den aktuellen FPC 2.4.2
- Update Lazarus auf die Version 0.9.30, auch wenn noch keine Downloads verfügbar sind, ist die neue stabile Version schon im SVN enthalten
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 174
- Registriert: Do 3. Mär 2011, 21:34
- OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
- CPU-Target: Intel 32/64Bit, ARM9
- Wohnort: Ulm
Re: Memo Speicher freigeben
Eigentlich einfach Antwort. Aber wenns hilf.Socke hat geschrieben:Hallo,
ich habe gerade dein wunderbares Minimalbeispiel bei mir nachgebaut, aber bei mir wurde laut der Unit heaptrc jeder Speicher auch wieder freigegeben.
Daher meine Ratschläge:Bei mir läuft nämlich Lazarus 0.9.31 und FPC 2.5.1, also wesentlich neuere als in deiner Signatur stehen. Wenn danach das Problem immer noch besteht, könnte es sein, dass es inzwischen in einer Entwickler-Version geändert wurde, oder es ist ein Fehler, der nur unter Windows auftritt (hab ich nämlich nicht).
- Update auf den aktuellen FPC 2.4.2
- Update Lazarus auf die Version 0.9.30, auch wenn noch keine Downloads verfügbar sind, ist die neue stabile Version schon im SVN enthalten
Neueres Lazarus installiert, Problem: Lnet tut nich mehr, auch noch Lnet-Update gemacht, Compiler läuft glatt durch.
Hab auch mein Minimalbeispiel probiert. Auch einwandfrei.
Hätte nicht gedacht, daß ich bei meinem ersten Pille-Palle-Prog gleich auf so eine Macke auflaufe.
Ich war eher der Annahme, daß die Funktionen, die ich benutze, schon tausendfach irgend wo ticken.
Und mit Updates bin ich eher sparsam (Dont touch a running...)
Also: Haken dran, und danke für den Tip.
Gruß
NoCee