има ли начин да освободите памет след използване на IHTMLDocument (IHTMLDocument2)?
В момента използвам функцията EmptyWorkingSet но чувствам, че това не е добър начин да го направя
EmptyWorkingSet(GetCurrentProcess);
Дори освобождаването на TWebBrowser не помага; проблемът изглежда е в IHTMLDocument COM клас, който не е освободен от паметта. Има ли ясен начин да го освободите; нещо като Marshal.ReleaseComObject, но е налично за Delphi?
Възпроизвежда се с по-малко загуба на памет, отколкото при стартиране на JavaScript, но все пак. Ако поставите два бутона в горната част на формуляра и опитате следния код...
uses MSHTML, SHDocVw;
type
TForm1 = class(TForm)
private
WebBrowser: TWebBrowser;
HTMLDocument: IHTMLDocument2;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser := TWebBrowser.Create(nil);
TWinControl(WebBrowser).Parent := Self;
WebBrowser.SetBounds(8, 39, ClientWidth-16, ClientHeight-47);
WebBrowser.Navigate('http://maps.google.com/');
HTMLDocument := WebBrowser.Document as IHTMLDocument2;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
WebBrowser.Free;
HTMLDocument := nil;
end;
Ще видите как паметта се губи след всяко освобождаване на уеб браузър. Когато стартирам моя JavaSrcipt, той е дори повече от 300 kB, това е около 1 MB и това може да причини изтичане на памет, в случай че изпълнявам това много пъти.
Благодаря много
EmptyWorkingSet
всъщност не освобождава памет. Той просто прехвърля активната памет на диск. Вашият процес все още притежава тази памет; достъпът до него ще го върне обратно в RAM. Как измервате потреблението на памет от вашия процес и какво ви кара да мислите, че изобщо имате проблем за отстраняване? - person Rob Kennedy   schedule 19.05.2011nil
наHTMLDocument
и след това да освободитеWebBrowser
. Друго (вероятно несвързано) нещо е, чеWebBrowser.Document
може да не съдържа валидноIHtmlDocument2
още веднага следNavigate
(страницата може все още да се зарежда). Вероятно трябва да използвате събитие катоOnDocumentComplete
. - person Ondrej Kelle   schedule 19.05.2011Navigate('about:blank')
, преди да освободите. - person Ondrej Kelle   schedule 19.05.2011OnDocumentComplete
събитие и чакане заTWebBrowser.ReadyState = READYSTATE_COMPLETE
в цикъл, така че трябва да има валиден документ. ИNavigate('about:blank')
не помага, мислех, че може и да освободи документа по някакъв начин, но трябва да има такъв вид кеш за навигиране обратно към предишната страница. Но благодаря за идеите. - person   schedule 19.05.2011CoFreeUnusedLibrariesEx(0, 0);
освобождава големия блок памет веднага след използване на WebBrowser. - person   schedule 19.05.2011