Форум: "Сети";
Текущий архив: 2003.06.19;
Скачать: [xml.tar.bz2];
ВнизКак очистить память после WebBrowser Найти похожие ветки
← →
vi7777 (2003-04-12 14:50) [0]Как после каждой загрузки странички очищать память ? А то после 400 - 500 страниц прога занимает 50 -60 Мб опервтивки и потом просто вешается.
← →
Ihor Osov'yak (2003-04-14 21:58) [1]Очень мало информации для диагноза. Но расскажу о одной очень вероятной причине.
Есть маленький баг в D5 (и кажется он не устранен в D6) в методе function TOleControl.GetIDispatchProp(Index: Integer): IDispatch;
вследствии чего не освобождается счетчик использования интерфейсов (об этом баге в конце поста). А именно через этот метод в конечном итоге получаем TWebBrowser.Document.
Если по простому - то IHtmlDocument2 полученный через TWebBrowser.Document не будет уничтожен, даже если броузер давным давно уже загрузил другие документы - и память понемногу будет уходить.
Способ обхода: не использовать TWebBrowser.Document.
Я конечно понимаю, что для любителей кодировать а-ля бейсик, без этого никак не обойтись (пример а-ля бейсиковски:
var
doc : olevariant;
s1 : string;
begin
doc := WebBrowser1.Document;
s1 := doc.url;
end;
не делайте так.
Есть другой путь:
var doc:IHTMLDocument2;
s1 : string;
...
WebBrowser1.ControlInterface.Document.QueryInterface(IHtmlDocument2,doc);
if assigned(doc) then s1 := doc.Get_url;
Заметььте, что на ту же проблему можно нарваться и при не бейсиковском стиле -
WebBrowser1.Document.QueryInterface(... - здесь есть обращение к
WebBrowser1.Document со всеми последствиями...
ЗЫ . По поводу бага в
function TOleControl.GetIDispatchProp(Index: Integer): IDispatch;
var
Temp: TVarData;
begin
GetProperty(Index, Temp);
Result := IDispatch(Temp.VDispatch);
end;
понятно GetProperty в своих потрохах AddRef сделает...
Но посколько Temp есть TVarData, то компилятор кода по очистке той
интерфейсной ссылки,что в Temp живет, не сгенерирует...
Нужно было бы Борланду сделать так:
function TOleControl.GetIDispatchProp(Index: Integer): IDispatch;
var
Temp: TVarData;
begin
GetProperty(Index, Temp);
Result := IDispatch(Temp.VDispatch);
IDispatch(Temp.VDispatch):=nil;
end;
← →
nikkie (2003-04-15 12:37) [2]Вот уж свинью подложил Борланд нам, любителям кодировать по-бейсиковски :)
Игорь, спасибо за полезную информацию. В самом деле проблема. И в D6 не исправлено, а судя по вопросу - и в D7. Странно, поскольку проблема была обнаружена еще в 1999 году. Я вот какое сообщение обнаружил в ньюсгруппах:
От:Henri Fournier (hfournier@wave.home.com)
Заголовок:Re: TWebBrowse & Trapping Errors
Группы новостей:borland.public.delphi.activex.controls.using
Число:1999/03/20
Try this:
Alexei M Reatov <alexei@mail.href.com> found a bug in OleCtrls causing
terrible memory leaks when working with the TWebBrowser-ActiveX component.
function TOleControl.GetIDispatchProp(Index: Integer): IDispatch;
var
Temp: TVarData;
begin
GetProperty(Index, Temp);
// Result := IDispatch(Temp.VDispatch); ***** Change to:
Pointer(Result) := Temp.VDispatch; ***** This avoids the extra
AddRef
end;
Same applies to GetIUnknownProp().
By decending the TWebBrowser object from the attached TOleControlFix, the
problem is solved in a packet-compatible way.
--
Henri Fournier
http://members.home.com/hfournier/
← →
Ihor Osov'yak (2003-04-15 12:54) [3]2 nikkie © (15.04.03 12:37)
говорю же, что по-бейсиковски на бейсике надо :-).
С этой проблемой воевал в 2001, к сожалению тогда не нашел той информации, которую Вы привели, пришлось самому копать...
← →
nikkie (2003-04-15 15:13) [4]>по-бейсиковски на бейсике надо :-)
не убедишь. у меня другой тезис - по сишном на си надо :p
>к сожалению тогда не нашел той информации
так не сложно было найти ответ, когда заранее его знал :)
я кинул GetIDispatchProp в поисковик - и готово. а вот тебе проблема изначально не была ясна, поэтому и поиск тут дело гиблое. так что мой большой тебе regards :)
← →
Ihor Osov'yak (2003-04-15 16:37) [5]2 nikkie © (15.04.03 15:13)
Флейма ради - интерфейсы все же делфи как-то ближе, чем си, ну во всяком случае есть поддержка на уровне языка.. Так что рискну подать твою фразу в такой редакции:
- а на делфи по-делфийски надо..
Но это уже будет моя фраза :-)
Зы - я не есть фанат делфи и моя религия не запрещает мне смотреть в сторону си. Мало того, некоторые проекты я все-же делаю на си.. Правда, делфийских намного больше..
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.06.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c