AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Arbeitsspeicher saugt sich voll

Ein Thema von youuu · begonnen am 1. Mär 2011 · letzter Beitrag vom 1. Mär 2011
Antwort Antwort
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#1

Arbeitsspeicher saugt sich voll

  Alt 1. Mär 2011, 13:41
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:
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;
später wird im finally Block, die Klasse wieder frei gegeben.
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?
Steven
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Arbeitsspeicher saugt sich voll

  Alt 1. Mär 2011, 13:50
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Arbeitsspeicher saugt sich voll

  Alt 1. Mär 2011, 14:09
CoUnInitialize ... du gibst die COM-Library frei, bevor die COM-Objekte in doc und vorallem im Result freigegeben wurden?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#4

AW: Arbeitsspeicher saugt sich voll

  Alt 1. Mär 2011, 14:18
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?
Steven
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Arbeitsspeicher saugt sich voll

  Alt 1. Mär 2011, 14:23
Setze das Interface mal auf NIL, wenn du es nicht mehr brauchst. Freigeben kann man ein Interface nicht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Arbeitsspeicher saugt sich voll

  Alt 1. Mär 2011, 14:25
Setze das Interface mal auf NIL, wenn du es nicht mehr brauchst. Freigeben kann man ein Interface nicht.
Normalerweise muss man das nicht. Beim IE muss man aber ab und zu bei Interface auch mal _Release aufrufen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#7

AW: Arbeitsspeicher saugt sich voll

  Alt 1. Mär 2011, 14:34
Hm, wie ruf ich das denn am besten auf?

Ich verwende es so weiter:

Delphi-Quellcode:
  doc := GetDocument( slSource );

  document := doc as IHtmlDocument2;
Steven
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Arbeitsspeicher saugt sich voll

  Alt 1. Mär 2011, 14:52
Delphi-Quellcode:
  doc := GetDocument( slSource );
  document := doc as IHtmlDocument2;
  
  ...

  doc._Release;
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:20 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