Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.009 c
14-60370
Dimaz-z
2003-06-01 10:50
2003.06.19
Подскажите ссылку на Орешник!


1-60224
killer
2003-06-04 17:27
2003.06.19
как сделать справой стороны TMainMenu картинку?


1-60117
Seldon
2003-06-04 21:46
2003.06.19
Console Application


1-60166
Navi
2003-05-31 08:03
2003.06.19
Перемещение курсора по сетке


1-60193
Xeon
2003-06-04 16:41
2003.06.19
Реестр





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский