![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Утечка памяти и как лечить, не пойму ничего IEBrowser
Signal © (2016-03-19 10:36:00)[CODE]
for i := 200 to iDoc.all.Get_length-1 do
begin
iDisp := iDoc.Get_all.item(pred(i), 0);
iDisp.QueryInterface(IHTMLElement, iElement);
[/CODE]
iDisp в конечном итоге начинает жрать кучу памяти и вылетает все сообщением Out of system resource.
Нашел в интернете только упоминание это проблемы для TwebBrowser, там надо править исходник этого Twebbrowser, а вот
iDoc у меня обявлен в VAR как IHTMLDocument2;
а создаю его текстом из файла следующим методом:
[CODE]
function GetHTTPTEXT_DOC2(TextHTML:String):IHTMLDocument2;
var
V: OleVariant;
begin
Result:=coHTMLDocument.Create as IHTMLDocument2;
V:=VarArrayCreate([0,0], varVariant);
V[0]:=TextHTML;
Result.Write(PSafeArray(TVarData(v).VArray));
end;
[/CODE]
вообщем что можно использовать вместо конструкции
iDisp := iDoc.Get_all.item(pred(i), 0);
iDisp.QueryInterface(IHTMLElement, iElement);
Signal (2016-03-24 16:24:00) [1]я не через TWebBrowser а чере iWebbrowser2, т.е. через Internet Explorer, грохать его не вариант и обновлять страницу тоже, т.к. все на странице именится
ВладОшин (2016-03-24 13:46:00) [2]я периодически грохаю TwebBrowser и пересоздаю
т.к.
> надо править исходник этого Twebbrowser
даже так у меня не получилось, все равно течет
Signal (2016-03-23 22:03:00) [3]было бы круто
__walk.length-1
если бы их не было бы 1,5 милиона в каждом цикле...гы
я,конечно разными особенностями это решил, но это костыли и бубны
han_malign (2016-03-21 17:03:00) [4]можно попробовать завернуть во врапер, чтобы все неявные ссылки гарантированно очищались(в неявных секциях try finally).
procedure wrap_collection;
var __walk: IHTMLElementCollection;
procedure wrap_element(i: integer);
var iDisp: IDispatch;
iElement: IHTMLElement;
begin
iDisp := __walk.item(pred(i), 0);
iDisp.QueryInterface(IHTMLElement, iElement);
...
end;
var i: integer;
begin
__walk:= iDoc.all;
for i := 200 to __walk.length-1 do wrap(i);
end;