Pascal->TWebBrowser->Uvolňování RAM paměti
Dobrý den,
vytvářím webový prohlížeč v Turbo Delphi. Dynamicky vytvářím nové listy, na kterých se dynamicky vytvářejí komponenty TWebBrowser. Neuvolňuje se mi však po zavření listu RAM paměť.
Po vykonání TWebBrowser(FindComponent('WebBrowser'+inttostr(de letedpage))).Free; se neuvolní skoro žádná paměť.
Předpokládám tedy, že musím nejdříve smazat načtený obsah komponenty TWebBrowser a pak teprve uvolnit samotnou komponentu.
Nějaký nápad?
Děkuji
(Pro zajímavost: Po vytvoření sto dynamických listů (+WebBrowserů) s načtením stránky Google.cz program využívá okolo 500MB RAM paměti. Po provedení Free včech komponent TWebBrowser klesne využití RAM paměti asi o 5MB)
Ono záleží aj ako vytváraš komponentu...Predpokladám dynamicky za behu programu? Nastavuješ komponente pri vytváraní vlastníka Create(AOwner)? Potom by si mal odstrániť komponentu: self.RemoveControl(WebBrowser) - ale naozaj bez celého kódu, je to špekulovanie...
Ešte môžeš experimentovať s TWebBrowser().Document :=nil, TWebBrowser().Free, TWebBrowser.nil, prípadne FreeAndNil(WebBrowser).
Ano, stačilo by pravděpodobně Document:=Nil, je však Read-Only. TWebBrowser vytvářím až za běhu programu. Za běhu je velmi často přejmenovávám.
Vytváření:
Zničení:
1)
2)
V obou případech stejný dopad.
Pokiaľ vytváraš komponenty dynamicky a neskôr ich chceš uvoľniť za behu programu, vždy použi nil ako vlastníka pri vytváraní, skús takto:
Při použití Nil však program spadne hned jak přistoupím na kteroukoliv vlastnost komponenty přes TWebBrowser(FindComponent('WebBrowser'+IntToStr(Ta bNumber)))
Došel jsme však k zajímavému objevu. Používám prohlížeč Opera. Vyzkoušel jsem, jak je to zde s uvolňováním RAM.
Využití RAM po zapnutí Opera
68 800
Využití RAM při 100listech Google.cz
654 000
Využití RAM po zavření všech listů
381 680
Z toho vyplývá, že se uvolnilo pouze 47% paměti RAM. Samozřejmě nevím, jestli je to tak normální. (Windows 7)
FreeAndNil(); Neuvolní paměť žádnou. Ještě se o 1MB zvýší využití RAM.
Zkus pred odstranenim listu zavolat Navigate s adresou 'about:blank'
Nepomáhá.
No, celého si ma tak trošku "domotal". (Sám som sa domotal.. )
Z toho čo som pochopil tak máš hlavný Formulár a na ňom PageControl, v ktorom potom dynamicky vytváraš listy (Tabsheet) a v nich následne TWebBrowser.
Čiže ja by som to riešil asi nasledovne:
1. Vytvoril by som proceduru, kde by sa dynamicky vytvárali TabSheet+WebBrowser:
2. potom by som si vytvoril procedúru, kde by som zatváral napr. aktívny list aj s následným zrušením WebBrowsera:
Chlape, s tím sis neměl dávat práci. To mám hotovo, potřebuji ale vyčistit ten TWebBrowser.Document Vím, že nemusím ničit TWebBrowser, že můžu zničit rovnou TTabSheet. Nechtěl jsme do toho plést ještě TPageControl a proto jsem uvedl WebBrowser.Free. (Ve výsledku se při uvolnění TTabSheetu uvolní i TWebBroswser, ale to neřeší můj paměťový problém. Ovšem ta Opera mě překvapila.)
Ale jak by jsi při použití tvého kódu vytvářel další TTabSheety a jak přistupoval k přibívajícím TWebBrowserům? Měl jsme to nejprve dělané přes pole komponent, ale to jsem zrušil, kvůli přejmenovávání komponent.
Ako pristupovať k TWebBrowserom?
Jednoduché napr: (píšem z hlavy, tak sú možno chyby)
Vyzkoušel jsem a nic. Pravděpodobně je to kvůli rozdílu Delphi 2010/Delphi 2006
Po spuštění:
992kB
Po provedení 13x CreateTabBrowser
96 376kB
Po provedení 13x CloseTab
94 464kB
Aha, ty uvolňuješ obě komponenty. Stačí přeci jenom TTabSheet ne? TWebBrowser se uvolní s ním.
Skús môj uvedený kód vyššie s uvoľňovaním TTabSheet +TWebBrowser (ja som si ho samozrejme najprv vyskúšal u seba Delphi 2010) - mne sa RAM uvoľňuje v pohode, tak ako si chcel Ty...
apsal jsem program v Delphi XE
Po ukončení se však uvolní jen 2MB. Nemůže to být ještě něčím jiným ve Windows?