Newsgroup: it.comp.lang.delphi
Titolo: problemi di memoria con TWebBrowser

ciao a tutto il ng.
Non capisco proprio dove sbaglio. Ho una tabella mysql contenente degli 
indirizzi internet. Faccio un loop sui record di tale tabella e per ogni 
sito creo un TWebBrowser. Sull'evento DocumentComplete della pagina faccio 
eseguire questa procedura
procedure TfrmControllo_url.wbControllo_urlDocumentComplete(ASender: 
TObject; const pDisp: IDispatch; var URL: OleVariant);
var DOM : variant;
    contenuto: string;
    pagina_html: TextFile;
    CurWebrowser : IWebBrowser;
    TopWebBrowser: IWebBrowser;
begin
  CurWebrowser := pDisp as IWebBrowser;
  TopWebBrowser := (ASender as TWebBrowser).DefaultInterface;
  if CurWebrowser=TopWebBrowser then begin
    DOM := TWebBrowser(ASender).Document;
    contenuto := DOM.Body.OuterHTML;
    AssignFile(pagina_html, ExtractFilePath(Application.ExeName) + 
contenuto_' + IntToStr(self.url.id_url) + '.html');
    ReWrite(pagina_html);
    WriteLn(pagina_html, contenuto);
    CloseFile(pagina_html);
    if not self.url.errore_caricamento then begin
      try
        Verifica_variazione();
      finally
        self.url.errore_caricamento := False;
      end;
    end;
  end;
end;
per salvare il contenuto del frame principale in una pagina 
contenuto_#.html.
Nella proceduraVerifica_variazione() confronto il nuovo contenuto con uno 
vecchio memorizzato nel db. Se sono diversi salvo quello nuovo.
Il tutto funziona ma dopo pochi url l'occupazione di memoria supera i 150 MB 
e cresce di continuo, nonostante abbia inserito 
FreeAndNil(oggetto_TWebBrowser); Inoltre anche chiudendo la form la memoria 
non mi si libera.
Solo chiudendo l'applicazione tutta la memora viene deallocata 
(naturalmente)...
A questo punto la mia domanda č: come faccio a liberare la memoria usata dai 
TWebBrowser? Oppure, esiste una altro oggetto che mi permette di salvare il 
contenuto di una pagina internet sia con metodo GET sia con POST?
Grazie
Luca 

 (naturalmente)...
I COM, a differenza dei componenti vcl, non ncessitano di una
free/destroy/release in quanto è il sistema operativo a occuparsene,
qualora la relativa reference count fosse pari a zero.
Il "prezzo" da pagare e' che le variabili che usi per gli handle dei
COM devono avere uno scope ben delimitato.
Se  hai un metodo nel quale e' dichiarata una variabile che usi per
gestire un istanza COM, essa viene rilasciata automaticamente appena si
esce dal metodo.
Se hai un metodo nel quale istanzi un com e lo assegni ad una variabile
dichiarata come private a livello di una classe, ogni volta che usi
quel metodo verra creata una istanza COM, ma le precedenti non saranno
liberate finche la variabile dichiarata come private "vive", ovvero,
fino alla free/destroy della classe che contiene il tutto.
Bastano poche chiamate al metodo e la tua app si succhia tutte le
risorse di sistema e buonanontte.
A parte cio, potrebbe trattarsi di un banale memory leak.
Ti suggerisco quindi di controllare prima di tutto che le variabili
usate per gestire i com siano locali ai metodi.
Se ge' gia cosi, cerca dei memory leak.
A

 eseguire questa procedura [...]
Oltre a quanto ti ha già detto Alberto, nonostante sembra che tu stia 
utilizzando correttamente gli oggetti COM incorporati nel controllo 
WebBrowser (visto che fai uso solamente di interfacce), considerando ciò 
che devi fare mi verrebbe da suggerirti di adottare un altro metodo.
Se devi scaricare pagine HTML e fare confronti, forse l'uso di un 
WebBrowser non è la scelta ottimale: perché scomodare un controllo 
visuale che ha il compito di mostrare le pagine quando desideri 
solamente verificarne il contenuto?
Usa il componente *TIdHttp* (Indy Components) e sfrutta il metodo /Get/ 
per scaricare la pagina desiderata e compiere tutte le operazioni che 
desideri su di essa. Credo sia più semplice rispetto all'uso di un 
WebBrowser che ha prerogative più di "visualizzazione" che di 
manipolazione del flusso HTTP ottenuto.
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 solamente verificarne il contenuto?
azz... nella fretta non mi sono soffermato su questo aspetto... :-((
Effettivamente usare quel com per questo scopo e' fuori luogo...
A.

 Effettivamente usare quel com per questo scopo e' fuori luogo...
Si trattava solo di un'ipotesi, anche perché non avendo tutto il codice 
del nostro amico a disposizione, non è possibile verificare che il 
controllo WebBrowser venisse adottato anche per altri scopi differenti. ;-)


 manipolazione del flusso HTTP ottenuto.
Grazie. Sono passato al componente TIdHTTP e funziona sia col metodo GET sia 
col POST. Inoltre sfruttando la tecnica multi-thread oltre ad utilizzare 
meno memoria, risulta anche molto più veloce.
Luca