TWebbrowser memory leak - jak sobie radzić ???

0

mam problem z TWebbrowser - komponent otwiera strony wg listy sporządzonej przez klienta - problem w tym że tych stron jest bardzo dużo a po każdym otwarciu ilość pamięci zajmowanej przez program zwiększa się o ok 2 MB, oczywiście prowadzi to po pewnym czasie do wywalenia systemu

szukałem po sieci - znalazłem mnóstwo opisów problemu ale tak naprawdę żadnego rozwiązania - zresztą te opisy odnoszą się jakby do sytuacji gdzie webbrowser jest tworzony dynamicznie czego nie ma w moim przypadku - cholera wierzyć mi się nie chce że nie da się tego rozwiązać

wywołanie (w OnTimer) wygląda tak:

 for I := 0 to ListBox1.Count - 1 do
  begin
    status:=2;
    nrkat:=i;
    WebBrowser1.Navigate(ListBox1.Items[i]);
    while WebBrowser1.busy do
        application.handlemessage;
    if Button1.Caption='Start' then break;
    wait(random(c2-c1)+c1);
  end;
  

komponent jest statyczny, delphi 2006, wersja ie i systemu jest nieistotna (błąd występuje zarówno przy ie 7,8,9 w XP Viście i win7)

sprawa jest dla mnie extremalnie ważna - pomocy

0

tak się zapytam czy te linie z listbox to linki do stron czy pliki i takie zapytanie czy próbowałeś zwalniać pamięć po załadowaniu strony i przed ponownym załadowaniem innej (nie jestem pewien czy istnieje coś takiego)? a co do kontrolki webbrowsera to chyba jest ona tylko w w wersji 5.0 ale nie jestem pewien bo korzystałem z niej tylko raz na xp z ie5
ale mogę się mylić

0

Próbowałeś dynamicznie stworzyć i zwalniać TWebBrowser ?przed otwarciem nowej strony ?

0

i to co widzę wygląda jak jakiś lipny bot net ;]

0

w listboxie są linki do stron
o zwalnianiu pamięci przeglądarki nie słyszałem (z wyjątkiem jej zniszczenia oczywiście) i tak próbowałem ją tworzyć i zamykać, co ciekawe operacje destroy czy free wcale nie zmniejszają ilości pamięci zajmowanej przez program ...
pewne skutki przynosi użycie SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF); co znalazłem jako rozwiązanie tego problemu ale jest to rozwiązanie połowiczne po przy następnym wywołaniu navigate zajmowana przez program pamięć wraca do normy

program nie jest botem ma jedynie monitorować zawartość pewnych stron, niestety ze względu na ajax i skrypty js muszę korzystać z pełnej funkcjonalności przeglądarki i czytanie samego źródła odpada ...

pomocy - czy naprawdę na całym wielkim 4programers nie ma ani jednej osoby która miała by solidną wiedzę na temat twebbrowser ?

0

ale ajax czy js nie tworzy kodu strony tylko robi to przeglądarka tzn nie ma znaczenia przez co pobierasz dane. Jak byś mógł wrzucić tu twój program to by się coś poradziło.
a co do komponentu to dość rozbudowany program w oparciu o ten komponent masz tu
http://kupa.info/hackme/download/delphi/source/MiniWebbrowserDemo.rar

0

sory ale ten program jest obarczony tym samym błędem - otwieranie kolejnych stron powoduje ciągły wzrost zajmowanej pamięci
i będzie to robił zapewne każdy program opary o ten komponent - mój naprawdę nie robi niczego szczególnego - po prostu otwiera dużo stron i robi się problem - pytanie brzmi jak tą pamięć zwolnić bo nawet zniszczenie przeglądarki nie pomaga ...

0

jak tą pamięć zwolnić bo nawet zniszczenie przeglądarki nie pomaga ...

Nie wiem co w Delphi jest żeby sprawdzić wycieki pamięci ale je sprawdź (pod FPC to jest heaptrc).

poza tym, skoro to coś bazuje na IE, to to cud że to działa. Więc poszukaj może czegoś co nie bazuje na IE tylko na czymś lepsiejszym...

0

wygląda na błąd kontrolki WebBrowsera - nic nie poradzisz
spróbuj Chrome Frame albo kontrolki firefoksa

poza tym jesteś pewien że ta pamięć się ciągle zwiększa? w normalnej przeglądarce też liczba zajmowanej pamięci ciągle wzrasta bo sobie coś tam cachuje żeby szybciej wrócić do poprzednich stron ale ostatecznie utrzymuje się na stałym poziomie

0

co do ajaxa - oczywiście że ma znaczenie w czym otwierasz dynamiczna stronę - samo pobranie pliku html nie wystarczy do uzyskania potrzebnych informacji bo strona je po prostu doczytuje

0

unikalna_nazwa - pytanie: czy to coś z chrome umożliwia potem dostęp do DOMa (czy jakoś tam po ichniemu) znasz może jakieś źródła na ten temat ?

albo inaczej, jak po zwykłym odczytaniu strony (w każdym razie bez silnika przeglądarki) przejść do czegoś ala DOM bo wyszukiwania wśród dziesiątek odpowiednich parametrów do tego doczytania w tabelkach przy pomocy parsowania przerasta moje siły gdyż strony te się jednak od siebie różnią i po prostu bez DOMa się nie da...

0

nigdy z tego nie korzystałem, a delphi nie widziałem już z 7 lat na oczy
ale z tego co widzę to używa się z tego korzystając z javascriptu

wysyłasz javascript do strony używając

GCF.PostMessage('TUTAJ JAVASCRIPT');

i w tym javascripcie możesz baaaardzo łatwo operować już na elementach DOM, możesz nawet wykorzystać jQuery - potem zwracasz do aplikacji dane poprzez obiekt o nazwie externalHost

zajrzyj do przykładowego programu i wszystko stanie się jasne

a bez silnika przeglądarki najłatwiej zapytaniami regularnymi - powinno się obejść spokojnie bez DOMa - na tej stronie znajdziesz wszystko http://www.regular-expressions.info/delphi.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1