Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Datei bearbeiten und nur Teile wieder speichern (https://www.delphipraxis.net/109379-datei-bearbeiten-und-nur-teile-wieder-speichern.html)

Hoschie 4. Mär 2008 19:19

Re: Datei bearbeiten und nur Teile wieder speichern
 
Moin und Danke,

zur Frage: ja, in jeder Datei ist nur ein Element Lehrgang drin und innerhalb des Elementes sind dann mehrere Childs.

Es läuft auch soweit, recht gut, nur nach unbestimmter Zeit bleibt er hängen. Ich habe dann versucht, das so zu machen, dass ich den Speicher der Variablen dann mit free wieder freigebe, allerdings kennt er das mal wieder nicht und in der MSXML_TLB habe ich dazu auch nichts gefunden. Geht das auch mit Release ? Oder woran könne das sonst noch liegen ?

Die versteckten Anregungen sind klasse, vereinfacht vieles. ;-)

Gruß
Hoschie

marabu 4. Mär 2008 19:29

Re: Datei bearbeiten und nur Teile wieder speichern
 
Wenn du glaubst, dass dir der Speicher zuläuft, dann solltest du ein Werkzeug wie z.B. Hier im Forum suchenMemCheck einsetzen.

Hoschie 5. Mär 2008 09:12

Re: Datei bearbeiten und nur Teile wieder speichern
 
Also ich habe nach 128 aufgerufenen XML Seiten so an die 260.000 Kb gemäß dem TaskManager, da ist es ja kein wunder, dass die Anwendung sich irgendwann aufhängt. Ich befürchte, dass ich irgendwie das WebBrowser Dokument wieder freigeben muss, bevor ich erneut darauf zugreife. Nur wie weiss ich noch nicht. Irgendwelche Tipps ?

Ich werde heute Abend mich mal an MemCheck ranwagen.

Kann ich WebBrowser so freigeben :
Delphi-Quellcode:
WebBrowser1.Document.free
und ihn dann gleich wieder erneut aufrufen oder muss das anders aussehen ?

Gruß
Hoschie

marabu 5. Mär 2008 09:33

Re: Datei bearbeiten und nur Teile wieder speichern
 
Moin Hoschie,

wenn du größere Dokumente geladen hast, dann belegt das aufgebaute DOM natürlich reichlich Speicher. Sobald du ein neues Dokument lädst, wird dieser Speicher aber automatisch wieder freigegeben. Du selbst kannst das mit WebBrowser.Navigate('about:blank') veranlassen.

Von dir verwendete Automationsobjekte (COM) werden automatisch freigegeben, sobald sie nicht mehr verwendet werden. Du kannst die vorzeitige Freigabe erzwingen, indem du sie einfach auf NIL setzt. Free() dient der Freigabe von Delphi-Objekten.

Freundliche Grüße

Hoschie 5. Mär 2008 09:54

Re: Datei bearbeiten und nur Teile wieder speichern
 
Dadurch das ich ja gleich nach der Abbarbeitung die nächste Webseite aufrufe habe ich ja keine Möglichkeit den Speicher des Dokumentes mit aufruf der Seite about:blank freizugeben. Aber wenn alles automatisch freigegeben wird, wie erkläre ich mir dann den horenden Speicherbedarf, der mit jeder aufgrufenen Seite anwächst.

Gruß
Hoschie

Bernhard Geyer 5. Mär 2008 10:01

Re: Datei bearbeiten und nur Teile wieder speichern
 
Zitat:

Zitat von marabu
Wenn du größere Dokumente geladen hast, dann belegt das aufgebaute DOM natürlich reichlich Speicher. Sobald du ein neues Dokument lädst, wird dieser Speicher aber automatisch wieder freigegeben. Du selbst kannst das mit WebBrowser.Navigate('about:blank') veranlassen.

Von dir verwendete Automationsobjekte (COM) werden automatisch freigegeben, sobald sie nicht mehr verwendet werden. Du kannst die vorzeitige Freigabe erzwingen, indem du sie einfach auf NIL setzt. Free() dient der Freigabe von Delphi-Objekten.

Theoretisch ja, praktisch hat die Implementierung im IE bezüglich Interfaces viele Fehler so das man hier (durch eigene Tests herausfinden welche) an diversen Stellen vor dem setzen auf nil einfach mal ein _Release einfügen muss um um das Problem zu löse. Jedoch schön alles mit try...except absichern da z.B. der IE 7 hier weniger Fehler hat als z.B. der IE 6 und man sonst bei einem Update das hier Fehler behebt sonst probleme bekommt.

Ich vermute mal das IE-Intern Objekte gegenseitig Interface-Zeiger halten so das hier eine "Deadlock"-Situation (ich glaube es gibt auch einen gebräuchlicheren Begriff) vorliegt.

himitsu 5. Mär 2008 10:05

Re: Datei bearbeiten und nur Teile wieder speichern
 
Zitat:

Zitat von marabu
Sobald du ein neues Dokument lädst, wird dieser Speicher aber automatisch wieder freigegeben. Du selbst kannst das mit WebBrowser.Navigate('about:blank') veranlassen.

also, TWebBrowser verwendet ja den IE und bei mir hat der IE ein Speicherleck ... wenn ich im IE selber viele Seiten hintereinander lade, dann müllt der auch so den RAM zu ;(

Dagegen hilft hier nur IE beenden und neu starten.

Falls die IE-Instanz nur vom TWebBrowser genutzt wird, dann sollte es vermutlich helfen, wenn man diesen freigibt (WebBrowser.Free) und dann neu erstellt (WebBrowser := TWebBrowser.Create) ... dann müßte ja hoffentlich auch die speicherfressende IE-Instannz gelöscht/feigegeben werden? :stupid:

Hoschie 5. Mär 2008 11:19

Re: Datei bearbeiten und nur Teile wieder speichern
 
Es wäre ja schon von Vorteil, wenn er den reservierten Bereeich nur überschreibt und nicht ständig erweitert. Ich werde das heute Abend mal antesten und dann melden.

Gruß
Hoschie

marabu 5. Mär 2008 11:24

Re: Datei bearbeiten und nur Teile wieder speichern
 
Hallo,

ich habe schon viele Threads in der DP zum Thema TWebBrowser und IE gesehen - sie hatten oft eines gemeinsam: Die falsche Darstellung der Beziehung zwischen dem Webbrowser Control und dem Internet Explorer. Das visuelle Herzstück des modular aufgebauten IE ist das Webbrowser Control und nicht umgekehrt. Der IE ist ein Host für das WB Control, so wie viele andere Browser (nicht FireFox oder Opera) auch.

Ich habe zu Zeiten von IE5 damit begonnen das Control in einem Projekt zu verbauen. Speicherlecks beim IE habe ich nie gesucht, es gab bis heute keinen Grund dazu. Ich will damit nicht behaupten, dass es diese Lecks nicht gäbe, alleine mir sind bisher keine aufgefallen.

Ich bin auch fest davon überzeugt, dass die Ursache für Speicherlecks im Programm von Hoschie zuerst in seinem eigenen Code gesucht werden muss.

Freundliche Grüße

Hoschie 5. Mär 2008 11:42

Re: Datei bearbeiten und nur Teile wieder speichern
 
Was durchaus sehr wahrscheinlich ist und ich das ganze nicht absprechen möchte, weil ich dafür vieeeel zu wenig Ahnung habe. Es sah für mich nur eben nach einem direktem Zusammenhang mit dem aufrufen der Seiten auf, weil die Speichermenge in dem Moment stieg, als er die neue Seitee geladen hat, Aber ich werde versuchen das ganze möglichst einzugrenzen mit dem MemCheck.

Trotzdem bin allen Postern hier sehr dankbar für die Hilfe :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:52 Uhr.
Seite 4 von 6   « Erste     234 56      

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