Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Speicherleak in Multithradanwendung verhindern. (https://www.delphipraxis.net/128153-speicherleak-multithradanwendung-verhindern.html)

Corpsman 25. Jan 2009 10:42


Speicherleak in Multithradanwendung verhindern.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hossa,

Ich bin gerade dabei mir eine Partikel Engine zu basteln.

Richtig Cool wird das natürlich erst wenn man die Berechnung der Partikelbahnen in einen Extra Thread auslagert, dachte ich mir.

Also habe ich mal angefangen und habe natürlich nun das Berühmte paralell ausführen Problem.

Worum es genau geht.

Ich habe in meiner Anwendung nun 2 Threads.

Die Hauptanwendung diese Füttert die Partikelengine mittels

AddPartikel

Immer Fleisig mit neuen Partikeln

Und Greift mittels

Render

auf diese zu.

Die Partikelengine ihrerseits

Berechnet die Flugbahnen der Partikel und Löscht diese wenn sie Negative Y-Werte Bekommen.

Mein Problem ist nun das

Hinzufügen und Löschen aus unterschiedlichen Threads geschieht, und damit Fehler auftreten. Wie man sehen Kann Geschieht dies allerdings nur wenn ich 10000 oder Mehr Partikel auf einmal hinzufüge.

Wie man im Auskommentierten Code sehen kann habe ich bereits mittels Synchronize bzw semaphore versucht das Problem zu verhindern. Nur Leider scheint mein Ansatz falsch zu sein.

Evtl könnt ihr mir ein wenig weiterhelfen.

Apollonius 25. Jan 2009 11:10

Re: Speicherleak in Multithradanwendung verhindern.
 
Ersetze zunächst einmal deine verkettete Liste durch eine TThreadList. Beim Durchiterieren musst du dann immer Lock und Unlock aufrufen, damit sichergestellt ist, dass nur ein Thread Zugriff hat. Es kann dabei allerdings zu Performanceeinbußen kommen. Dann kannst du über Lock-freie Listen nachdenken.

Corpsman 25. Jan 2009 13:54

Re: Speicherleak in Multithradanwendung verhindern. [gelöst]
 
Also :

Mehrfach Lesen ist ja kein Problem.

Die Liste hab ich weil ich zuvor ein Dynamisches Array hatte und das hat wirklcih Probleme gemacht.

Das Einzige Problem das also wirklich auftritt ist, wenn ich ein element Lösche welches gerade gelesen wurde.

Wie sich nun Herausgestellt hat. Tritt der Leak Fehler aber nicht deswegen auf.

Ich habe die Liste falsch Gekürzt.

Der Fehler Tritt immer dann auf, wenn ich neue Elemente einhänge, nachdem ich das
Letze Element bereits gelöscht hatte.

Nun habe ich die Löschen Procedur Entsprechend Angepasst, und die Engine läuft stabil und ohne Leak ;).

Getestet habe ich es nun mit 300000 Partikeln. ;).

Für die die Mitlesen und selbst weiterarbeiten wollen

Hier der neue "Lösch" Code der den Leak behebt.

Delphi-Quellcode:
 If p = Erstes Then Begin
        t := erstes;
        erstes := erstes^.next;
        dispose(t);
        p := erstes;
      End
      Else Begin
        t := p;
        v^.Next := p^.next;
        If p = Letztes Then Begin// <-- Neu
          Letztes := v;// <-- Neu
          v^.next := Nil;// <-- Neu
        End;
        p := p^.next;
        dispose(t);
      End;


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:12 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