есть ли способ освободить память после использования IHTMLDocument (IHTMLDocument2)?
В настоящее время я использую функцию EmptyWorkingSet но я чувствую, что это не лучший способ сделать это
EmptyWorkingSet(GetCurrentProcess);
Даже освобождение TWebBrowser не помогает; проблема, похоже, в COM-классе IHTMLDocument, который не освобождается из памяти. Есть ли четкий способ выпустить его; что-то вроде 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 КБ, это около 1 МБ, и это может вызвать утечку памяти, если я запускаю это много раз.
Большое спасибо
EmptyWorkingSet
фактически не освобождает память. Он просто выгружает активную память на диск. Ваш процесс по-прежнему владеет этой памятью; доступ к нему вернет его обратно в ОЗУ. Как вы измеряете потребление памяти вашим процессом и что заставляет вас думать, что вам вообще нужно решить проблему? - 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