wycieki pamięci WebBrowser

0

Używam WebBrowsera - nie jest to idealne narzędzie, ale ponieważ obsługuje skrypty Javy, wydaje się mimo wszystko korzystne.

Na formie jest WebBrowser i TPanel, po czym w procedurach wywołuję procedury typu wczytaj_stronę, wciśnij_klawisz, wykonaj_skrypt itp.
Zauważyłem jednak, że uruchomienie w pętli powoduje systematyczny wzrost zajętości pamięci po każdym wczytaniu strony, po dojściu do 600-800MB RAM zaczyna nieźle zmulać kompa. Przeraża mnie jednak perspektywa zwiększenia ilości danych do przetworzenia :(

Poszukałem w necie i znalazłem htakie rozwiązanie:
http://forum.ks-ekspert.pl/topic/132109-delphi-webbrowser-a-procesor/

 procedure TrimAppMemorySize; 
var MainHandle : THandle; 
begin 
try 
MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID); 
SetProcessWorkingSetSize(MainHandle, $FFFFFFFF, $FFFFFFFF); 
CloseHandle(MainHandle); 
except 
end; 
Application.ProcessMessages; 
end;

Zgodnie z zamieszczonym opisem:
*foo A więc wystarczy ją wywołać i efekt jest taki, że redukuje nam się zużycie pamięci, działa na cały program, nie tylko na programy z TWebBrowser *
Niestety, wywołanie tej procedury faktycznie na chwilę redukuje rozmiar aplikacji do kilkuset kB, jednak po wywołaniu
Application.ProcessMessages;
wraca do poprzedniego rozmiaru.
Czy komuś udało się rozwiązać problem zwalniania pamięci?

0

Czy komuś udało się rozwiązać problem zwalniania pamięci?

Wszystkim bo wychodzą z dwóch założeń:

  1. IE to zło
  2. Są dodatki które pozwalają na znalezienie wycieków pamięci

Najprawdopodobniej nie wiesz o przynajmniej jednym z tych założeń więc pogoogluj.

0

goglowałem - wiele zgłoszeń problemów, niestety brak rozwiązań. To, które wyglądało najbardziej obiecująco, działa pozornie. Nie muszę szukać wycieku, bo wiem, która kontrolka go powoduje - brak tylko informacji, jak je zlikwiwdować.
dzięki za chęci :)

0

brak tylko informacji, jak je zlikwiwdować.

Ja podpowiem: Wywalając kontrolkę.

0

brak tylko informacji, jak je zlikwiwdować.

Ja podpowiem: Wywalając kontrolkę.

genialne! i co dalej?

0

genialne! i co dalej?

Zainstaluj jakąś wtyczkę która spełnia twoje wymagania i która nie powoduje wycieków pamięci a jeżeli takiej nie ma to zrób swoją i sprzedawaj ją... Ludzie tacy jak ty kupią.

2

Zainstaluj jakąś wtyczkę która spełnia twoje wymagania i która nie powoduje wycieków pamięci a jeżeli takiej nie ma to zrób swoją i sprzedawaj ją... Ludzie tacy jak ty kupią.

Gdyby każdy myślał tak, jak Ty to większość ludzi by samochodu nie miała, bo po co jeździć tanim i psującym się, skoro można kupić wysokiej klasy z darmowym serwisem; Nie znasz odpowiedzi to milcz, bo pytanie brzmi:

zefir napisał(a)

Czy komuś udało się rozwiązać problem zwalniania pamięci?

a nie jakiej kontrolki wybrać, żeby wycieków pamięci nie było;

Swoje ironicznie głupie wypowiedzi zachowaj dla siebie i daj się wypowiedzieć ludziom, którzy potrafią pomagać i znają się na rzeczy; Żeby napisać swój komponent trzeba mieć dużą wiedzę, którą nie każdy posiada; Umiesz taką napisać? Napisz i podziel się - geniuszu;


@zefir, nie pomogę Ci, bo nie korzystam z tej kontrolki; Poczekaj na odpowiedź kogoś obeznanego w temacie i nie odpowiadaj na zaczepki;

1
zefir napisał(a)

Poszukałem w necie i znalazłem htakie rozwiązanie:
http://forum.ks-ekspert.pl/topic/132109-delphi-webbrowser-a-procesor/

 procedure TrimAppMemorySize; 
var MainHandle : THandle; 
begin 
try 
MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID); 
SetProcessWorkingSetSize(MainHandle, $FFFFFFFF, $FFFFFFFF); 
CloseHandle(MainHandle); 
except 
end; 
Application.ProcessMessages; 
end;

Zgodnie z zamieszczonym opisem:
*foo A więc wystarczy ją wywołać i efekt jest taki, że redukuje nam się zużycie pamięci, działa na cały program, nie tylko na programy z TWebBrowser *
Niestety, wywołanie tej procedury faktycznie na chwilę redukuje rozmiar aplikacji do kilkuset kB, jednak po wywołaniu
Application.ProcessMessages;
wraca do poprzedniego rozmiaru.
Czy komuś udało się rozwiązać problem zwalniania pamięci?

Ten kod nie służy zwalnianiu pamięci, absolutnie niczego nie redukuje. Jego skutkiem jest przeniesienie pamięci wirtualnej procesu z RAM do pliku wymiany, pamięć ta zostaje ponownie wczytana do RAMu, kiedy tylko program spróbuje uzyskać dostęp do danej strony pamięci. Sumaryczne zużycie zasobów pozostaje bez zmian. Jest to sztuczka używana przez wszelkiej maści pseudoprogramistów-oszustów, którzy próbują robić dobre wrażenie na użytkownikach, w końcu program nie potrzebuje przez 100% czasu 100% zaalokowanej przez siebie pamięci, można część zasobów zamaskować. Ceną za to maskowanie jest notoryczne mielenie dyskiem i znaczne pogorszenie wydajności aplikacji (dysk twardy jest setki razy wolniejszy od pamięci).

"Wyciek pamięci" stanowi historia przeglądania z użyciem tej konkretnej kontrolki, identycznie zachowują się wszystkie nowoczesne przeglądarki, częściowo buforują strony poprzednio odwiedzone w danej sesji.

0

@Furious:
Pytanie jest takie "Czy komuś udało się rozwiązać problem zwalniania pamięci [w TWebBrowser]?"
Po jego przetworzeniu wychodzi: "Czy komuś udało się naprawić błędy w czymś do czego nie mamy kodu i co jest znane z generalnej niezgodności z niczym [IE]?"
Teraz zastanówmy się, jaka jest szansa, że ktoś z nas tego dokonał (zwłaszcza że były już o tym pytania)? powiedzmy że 0%.
Dodatkowo, pytający stwierdził że pytał googla, i problem jest znany, ale żadnego fixa nie ma. Więc skąd my mamy mieć fixa skoro go nie ma?
Zrobiłem jedyną poprawną rzecz i zganiłem go bo pytanie już było wielokrotnie (i niestety nic na to się poradzić nie da) i poleciłem użyć innego komponentu. Ja proponuje tym którzy mnie minusują znalezienie solucji innej niż zmiana komponentu, bo moim zdaniem ujmując to prosto, nie da się tego zrobić nie modyfikując plików systemowych etc. - a to jest zdecydowanie nieopłacalne skoro istnieją lepsze komponenty.

W sumie wychodzi że pytający przejrzał całe google, i stwierdził że skoro w google nie ma to na pewno ktoś w dziale newbie zna odpowiedź (zwłaszcza że już o to pytali bez powodzenia). Czy nie jest to głupie? Moim zdaniem jest.

0

W sumie wychodzi że pytający przejrzał całe google, i stwierdził że skoro w google nie ma to na pewno ktoś w dziale newbie zna odpowiedź (zwłaszcza że już o to pytali bez powodzenia). Czy nie jest to głupie? Moim zdaniem jest.

Ano, przecież to normalne, że newbie mają problemy, których nikt nigdy nie widział lub nie rozwiązał. IE nie jest niczemu winny, używanie silnika przeglądarki internetowej do masowego wysyłania zapytań świadczy o niewiedzy i poleganiu na mało wiarygodnych źrodłach informacji (vide forum KŚ). Navigate jest odpowiednikiem przejścia do kolejnej strony w tej samej karcie przeglądarki internetowej, Opera czy Fx też będą mieć "memleaki", historia spuchnie po kilkuset kolejnych requestach. Rozwiązań jest kilka: nie używać tego samego komponentu do setek kolejnych zapytań, zmienić komponent (co pewnie niewiele da, Gecko prawdopodobnie zachowa się podobnie), zacząć po ludzku używać czystego HTTP (Synapse ktoś?) zamiast angażować kilkanaście MB dodatkowego kodu silnika JS, renderera, menadżera cache'u, komponentów ActiveX i $diety wie czego jeszcze.

TWebBrowser powinien być dostępny wyłącznie po dmuchnięciu w alkomat, okazaniu dowodu osobistego i zaświadczenia od proboszcza o uczęszczaniu na nauki przedmałżeńskie, zaś nielegalne udostępnianie komponentu należy zakazać pod karą kastracji dmuchanym młotkiem.

0

@-123
tylko Chuck Noris przejrzał CAŁE google. Idąc Twoim tokiem rozumowania, należy natychmiast zablokować możliwość zadawania pytań, bo skoro wcześniej nikt nie udzielił odpowiedzi, to takiej odpowiedzi nie ma. "Nie znasz odpowiedzi to milcz" - zastanów się nad sensem tych słów.

Na szczęście - jak widać - są jeszcze ludzie, którzy normalnie podchodzą do problemu i potrafią wskazać właściwą drogę, dziękuję :)
Próbowałem zamykać okno i otwierać je ponownie, ale niestety pojawia się komunikat Acces violance - muszę jeszcze nad tym popracować. Robiąc taki zabieg np. co dziesiątą operację, strata czasu będzie stosunkowo niewielka, a mam nadzieję, zacznie przydziały pamięci od początku.

0

przed zwolnieniem kontrolki wymus zainicjowanie nowego dokumentu:
(WebBrowser.Document as IPersistStreamInit).InitNew;
moze się zdarzyć, że proces zwalniania pamieci bedzie zbyt powolny - pokombinuj z parametrami kompilacji i przetestuj uruchamiajac bezposrednio exec'a. U mnie problem zniknal.

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