WebBrowser Memory Leak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
oklawa
Üye
Mesajlar: 68
Kayıt: 01 Oca 2008 02:53

WebBrowser Memory Leak

Mesaj gönderen oklawa »

Merhabalar..

SpTBXLib spTBXTabControl komponenti ile oluşturulmuş bir web browser formum var.
Bu komponenti tercih etmemin nedeni TabClose imkanı.
WebBrowser'in OnNewWindow2 eventine eklediğim birkaç satırla; yeni sayfaları yeni bir browser form oluşturup ve bu formu TabSheet'e gömerek programın ana formunda gösteriyorum.

Fakat yeni açtığım Tab'ı kapatsam da webbrowser'in hafızada kapladığı yer boşaltılmıyor.
Bir süre kullanımdan sonra program vahşet derecede hafıza kaplamaya başlıyor.

Yeni Tab için;

Kod: Tümünü seç

procedure TBrowserForm.BrowserNewWindow2(Sender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool);
Var NTab:TSPTBXTABITEM;
    BrwForm:TBrowserForm;
begin
  NTab := Form1.STC1.Add('Yeni Sekme');
  ntab.OnTabClose := Form1.SpTBXTabItem1.OnTabClose;
  BrwForm:=TBrowserForm.Create(NTab);
  BrwForm.Parent := TWinControl(Form1.STC1.GetPage(Ntab));
  BrwForm.Align := AlClient;
  BrwForm.BorderStyle := BSNone;
  BrwForm.Visible := True;
  Form1.STC1.ActivePage := Form1.STC1.GetPage(NTab);
  ppdisp := BrwForm.Browser.Application;
end;
OnTabClose;

Kod: Tümünü seç

procedure TForm1.SpTBXTabItem1TabClose(Sender: TObject);
var i:integer;
    Control:TControl;
Begin
  for i:=0 to stc1.GetPage(Sender as TSPTBXTabItem).ControlCount-1 do
   begin
    Control:=stc1.GetPage(Sender as TSPTBXTabItem).Controls[i];
    if Control.ClassName ='TBrowserForm' then
      begin
       (Control as TBrowserForm).Close;
       FreeAndNil(Control);
      end;
   end;
  STC1.Items.Remove(Sender as TSpTbxTabItem);
  stc1.GetPage(Sender as TSPTBXTabItem).Free;
 (sender as TSpTbxTabItem).Free;
End;
Formun OnClose eventi;

Kod: Tümünü seç

procedure TBrowserForm.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  Browser.Navigate('About:Blank');
  Browser.Destroy;
  Action:=CaFree;
end;
Sorun TWebBrowser'in kapladığı hafızanın boşaltılmamasından kaynaklanıyor.
Browser.Destroy; yerine Browser.Free de kullandım ama bişey değişmedi.
TWEBBrowser yerine TEmbeddedWB'de de aynı sorunu yaşadım.

İnternette uzun zamanları bu sorunun çözümünü arayarak geçirdim, çeşitli test uygulamaları var (FastMM, MemCheck vs.)
ama bunların hem kullanım açıklaması yeterli değil, hemde sadece Memory Leak'ları gösteriyorlar.
Sorunu çözmekle ilgili bir fonksiyona sahip değiller.

Sorunu görebileceğiniz kaynak kodu burada.

Bu konuda yardımlara çok müteşekkir olacağım..

Teşekkürler, saygılar..
oklawa
Üye
Mesajlar: 68
Kayıt: 01 Oca 2008 02:53

Mesaj gönderen oklawa »

Kod: Tümünü seç

procedure OptimizeRamUsage;
begin
      SetProcessWorkingSetSize(GetCurrentProcess, $ffffffff, $ffffffff);
end;
Bu problemimi çözdü.
Kaynak
Kullanıcı avatarı
barutali
Üye
Mesajlar: 297
Kayıt: 02 Tem 2007 02:30

Re: WebBrowser Memory Leak

Mesaj gönderen barutali »

Allah razı olsun kardeşim senden bir sürü kod denedim hiç biri işe yaramamıştı... 30.000 den bir anda 2.000 e düşürüyor ..
Cevapla