![]() |
Arbeitsspeicher saugt sich voll
Hi,
ich hab ein Problem, ich hab ein Programm, welches ich mit ca. 30 Threads laufen lasse (4 Kerne). Diese Threads erstellen eine Klasse, welche sämtliche Aufgaben ab arbeitet, z.B. - Source holen per Indy.Get - Source bearbeiten - Source in Document übergeben mit dieser Funktion:
Delphi-Quellcode:
später wird im finally Block, die Klasse wieder frei gegeben.
function THtmlSearch.GetDocument(const markup: WideString): IDispatch;
var doc: OleVariant; begin CoInitialize(nil); Result := CoHtmlDocument.Create; doc := Result; doc.Open; doc.Write(markup); doc.Close; CoUnInitialize; end; Jedoch wird jedesmal der Arbeitsspeicher beim erstellen der Klasse belastet, aber beim Frei geben per FreeAndNil() nicht wieder entlastet. So dass ich irgendwann an die 1 GB und manchmal wesentlich mehr in anspruch nehme und es bei der 2GB Grenze natürlich kracht. Gibt es da eine Lösung? |
AW: Arbeitsspeicher saugt sich voll
CoHtmlDocument? Hört sich nach IE an.
1, Es ist "normal" beim IE das man manche Angeforderte Interfaces mit _Release explizite 1-2 mal nochmals freigeben muss da dier IE interne sonst diese Ressourcen nicht freigibt 2, Die Verwendung von CoInitialize(nil)/CoUninitialize muss so erfolgen das alle Interfaces die du anforderst vor CoUnInitialize auch wieder freigegeben sind. CoInitialize(nil) rufst du am besten beim Tread-Beginn an, CoUninitialize beim Thread-Ende. |
AW: Arbeitsspeicher saugt sich voll
CoUnInitialize ... du gibst die COM-Library frei, bevor die COM-Objekte in doc und vorallem im Result freigegeben wurden?
|
AW: Arbeitsspeicher saugt sich voll
Ok CoInitialize und CoUnInitialize ist geändert, so dass es bei Threadbegin und Threadende gesetzt wurde, allerdings saugt der Speicher sich weiterhin voll.
Kann es also nur darin liegen das ich das Interface wieder freigeben muss? |
AW: Arbeitsspeicher saugt sich voll
Setze das Interface mal auf NIL, wenn du es nicht mehr brauchst. Freigeben kann man ein Interface nicht.
|
AW: Arbeitsspeicher saugt sich voll
Zitat:
|
AW: Arbeitsspeicher saugt sich voll
Hm, wie ruf ich das denn am besten auf?
Ich verwende es so weiter:
Delphi-Quellcode:
doc := GetDocument( slSource );
document := doc as IHtmlDocument2; |
AW: Arbeitsspeicher saugt sich voll
Delphi-Quellcode:
doc := GetDocument( slSource );
document := doc as IHtmlDocument2; ... doc._Release; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 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