AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Memory Leaks beheben

Ein Thema von w4rheart · begonnen am 18. Dez 2010 · letzter Beitrag vom 22. Dez 2010
Antwort Antwort
w4rheart

Registriert seit: 16. Mär 2010
53 Beiträge
 
#1

AW: Memory Leaks beheben

  Alt 21. Dez 2010, 16:47
Hallo nochmal!

Ich lese geradefolgendes Tutorial über Multithreading:
http://wiki.delphigl.com/index.php/T...Multithreading

Kann man mit Threads MemLeaks beheben, in dem man die kritischen Stellen einfach in einen Thread packt, welcher später freigegeben wird?
Diese Stelle hat mich auf den Gedanken gebracht:
Zitat:
Thread.FreeOnTerminate := True;
// FreeOnTerminate bedeutet sobald der Thread die Procedure Execute
// verlassen hat wird sein Speicher wieder von alleine Frei gegeben.
// andernfalls müsste später im Programm Thread.Free aufgerufen werden.
Wahrscheinlich funktioniert das nicht, das wäre ja auch zu schön... ?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#2

AW: Memory Leaks beheben

  Alt 21. Dez 2010, 16:50
Kann man mit Threads MemLeaks beheben
Nein.

FreeOnTerminate bezieht sich nur auf das Thread-Objekt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#3

AW: Memory Leaks beheben

  Alt 21. Dez 2010, 18:26
MemoryLeaks kann man nur durch gewissenhafte Programmierung verhindern.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
fui-tak

Registriert seit: 24. Okt 2008
117 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: Memory Leaks beheben

  Alt 21. Dez 2010, 18:54
Ich weis ja nicht, in wie weit du das bisherige schon verworfen hast, aber hier ich hab noch einen Fehler gefunden:

Edit: doch nicht...

Geändert von fui-tak (21. Dez 2010 um 18:58 Uhr)
  Mit Zitat antworten Zitat
w4rheart

Registriert seit: 16. Mär 2010
53 Beiträge
 
#5

AW: Memory Leaks beheben

  Alt 22. Dez 2010, 10:41
hello again!

Mir ist aufgefalle, dass der Memory Leak erst dann so extrem wird, wenn ein Spieler (Raumschiff) stirbt.
-> d.h. es liegt sehr wahrscheinlich doch nicht an den Netzwerkklassen, sondern daran, wie dieses Raumschiff gelöscht wird.

Ich poste mal eben wie es created und destructed wird, evtl. ist dort ein Fehler den ich nicht sehe:
Delphi-Quellcode:
  TRaumschiffSprite = class( TMySprite )
  public
    nick: string;
    farbe: TColor;
    leben, lebenMax: Extended;
    gesundheitsbalken: TBalken;
    spielerid: integer;
    constructor Create( AParent: TSprite ); override;
  end;

procedure TSpriteVerwaltung.neuesRaumschiff( pID: Integer; pSpielerID: integer; pFarbe: TColor; pX, pY, pLaenge, pKurs: Integer; pVX, pVY, pAX, pAY, pLeben, pLebenMax: Extended );
// Erstellt ein neues Raumschiff, weist ihm die entsprechenden Eigentschaften zu
// und fügt es in die Liste ein
var
  raumschiff: TRaumschiffSprite;
  particle: TAdBillboardParticle;
begin
  raumschiff := TRaumschiffSprite( getSprite( pID ) );
// es wird nur dann created, wenn das Raumschiff nicht bereits exisitiert.
//wenn es existiert werden nur unten die Werte wie x,y positiongeupdated etc.
  if raumschiff = nil then begin
    raumschiff := TRaumschiffsprite.Create( form1.AdSpriteEngine ); //hier wird das Raumschiff created
    raumschiff.id := pID;
    raumschiff.gesundheitsbalken := TBalken.Create( form1.AdSpriteEngine, 26, 3 );
    Add( raumschiff );
  end;

  with raumschiff do begin
    spielerid := pSpielerID;
    farbe := pFarbe;
    Angle := pKurs;
    x := pX - Width / 2;
    y := py - Height / 2;
    vx := pVX;
    vy := PVY;
    ax := pAX;
    ay := pAY;
    color := farbe;
    leben := pLeben;
    lebenMax := pLebenMax;
    gesundheitsbalken.x := x + 7;
    gesundheitsbalken.y := y + 40;
    gesundheitsbalken.Aktualisieren( lebenMax, leben, pVX, pVY, pAX, pAY ); // Lebensbalken aktualisieren (Breiten, v, a)
  end;
end;
Nun zum interessanten Teil, dem Löschen:
Delphi-Quellcode:
function TBefehlLoeschen.Ausfuehren( pParameter: string ): boolean;
var
  lID: integer;
  lSprite: TImageSpriteEx;
begin
try
  //Sprite in der Liste suchen und das Listenobjekt löschen
  lID := StrToInt( pParameter );
  lSprite := Form1.SpriteVerwaltung.getSprite( lID );
  Form1.SpriteVerwaltung.Remove( lSprite );
  if lSprite is TRaumschiffSprite then
  begin
    TRaumschiffSprite( lSprite ).gesundheitsbalken.Free;
  end;
//löschen des eigentlichen Sprites über Andorra
  lSprite.dead;
  result := true;
except
  on E : Exception do
    ShowMessage(E.ClassName+' error raised, with message : '+E.Message);
  result:=false;
end;
end;
Also wie gesagt, nach dem das erste mal ein Raumschiff zerstört wird, tritt dieser extreme Memory Leak auf.
Ist irgendwas mit meiner Löschen Methode falsch?

Wäre sehr nett, wenn Ihr mir nochmal weiterhelfen könntet
MfG

Geändert von w4rheart (22. Dez 2010 um 10:48 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 19:25 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