Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.19;
Скачать: CL | DM;

Вниз

Как очистить память после 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
1-60181
Jimal
2003-06-05 08:07
2003.06.19
CopyFile


8-60274
Kair
2003-03-02 21:26
2003.06.19
Буферизация


14-60408
uncle_Ru
2003-06-03 12:05
2003.06.19
Взлом InterBase


3-60015
delfin
2003-05-01 12:43
2003.06.19
DBGrid&Query - как правильно делать update НД


14-60328
Ежик
2003-06-03 17:22
2003.06.19
Занялся я тут одним проектом....