Webbrower的内存管理问题(100分)

  • 主题发起人 主题发起人 whj2000
  • 开始时间 开始时间
W

whj2000

Unregistered / Unconfirmed
GUEST, unregistred user!
我用多个twebbrower同时连续下载网页,发现占用系统内存相当多,很快就耗尽
所有的系统内存,直到关闭程序后,占用的内存才能释放。
请教有什么方法可以减少twebbrower对内存的占用,比如在下载一个新的页面时,
将下载的上一个页面时的占用的内存释放出来。
谢谢!
 
我的不会。
 
能将你的代码贴出来吗?
多谢了?
 
它的页面所用的内存(不是页面内存)采用全局堆分配的方式,具体请参阅微软中的一篇文章,
下次再说吧,我现在有事去了。
 
我的代码没什么特别的地方,用的时候创建它,浏览完毕就Free掉。
开一、二十个页面没问题,没有发现内存耗尽的情况。
其它应用程序delphi,word,照样可以运行。
 
CathyEagle能将你创建webbrowser的代码贴一下吗,我的用完后free居然没效果,
当程序退出时才释放内存。
我下几十个页面也问题不大,但我要下几百个页面,就不行了。
xiangya请说得详细一点。
多谢了!
 
我同时开10个webbrowser,下载了上千个也没问题,
开始下载时你会看到内存不断增加,但每个webbrowser
占用的内存达到一定数量时,就不会增加,估计
与你的机子装的IE有关。
问题的关键是webbrowser创建以后不要释放,因为
webbrowser释放后内存并没有释放,不知为什么!
最后程序退出时再释放。
 
可是我的webbrower占用的内存不断增加,毫无停止的迹象。
你的webbrower的参数和navigate函数的参数有无什么特殊的设置?
“占用的内存达到一定数量时”,这个数量大概是多少?
谢谢!
 
灌水一桶以表关注。。。
 
开上百个窗口?,好象free的时候并不把内存也frdd完哦,关闭后内存每次都会少一点,我也不知道
那出了问题。
//new
function tfrmhtmlbrowser.newpages(url: string): tEmbeddedWB;
var
tabsheet: ttabsheet;
webbrowser: tEmbeddedWB;
begin
tagcount := tagcount + 1;
tabsheet := ttabsheet.Create(Self);
tabsheet.Caption := url;
tabsheet.Tag := tagcount;
webbrowser := tEmbeddedWB.Create(Self);
webbrowser.Tag := tagcount;
webbrowser.ReplaceCaption := True;
tabsheet.PageControl := pagecontrol;
tabsheet.InsertControl(webbrowser);
webbrowser.Align := alclient;
webbrowser.OnStatusTextChange := webbrowserstatustextchange;
webbrowser.OnCommandStateChange := WebBrowserCommandStateChange;
webbrowser.OnDownloadComplete := webbrowserdownloadcomplete;
webbrowser.OnDocumentComplete :=webbrowserDocumentComplete;
webbrowser.OnBeforeNavigate2 := WebBrowserBeforeNavigate2;
webbrowser.OnDownloadBegin := WebBrowserDownloadBegin;
webbrowser.OnNewWindow2 := webbrowserNewWindow2;
webbrowser.OnTitleChange := webbrowserTitleChange;
if url <> '' then webbrowser.Go(url);
if checkbox_ShowNew.Checked then pagecontrol.ActivePage := tabsheet;
Result := webbrowser;
end;
//free
procedure Tfrmhtmlbrowser.CloseBtnClick(Sender: TObject);
var
i: integer;
begin
for i := 0 to pagecontrol.ActivePage.ControlCount - 1 do
pagecontrol.ActivePage.Controls.Free;
pagecontrol.ActivePage.Free;
if pagecontrol.PageCount = 0 then newpages('about:blank');
end;
 
内存不能完全回收,似乎和操作系统有很大关系。
 
正如xiangya所说的(内存采用全局堆分配),
同时开50webbrowser下载200个url时,从5M左右
一直增加到50-60M,然后稳定在那里,不在增加
如果同时开10个webbrowser大概在30M稳定,不在
增加。
如果你的内存不断增加,毫无停止的迹象,一定
不是webbrowser在作怪,是你的程序的问题,
把代码贴出来看看
 
多人接受答案了。
 
我在“我要上网去”浏览器(http://www.51357.com/)软件中解决此问题

TWebbrowser在ie4中有此问题:

把TWebBrowser= class(TOleControl)修改为TWebBrowser= class(TrsOleControl)



nit rsOleCtrls;

interface
uses
OleCtrls;

type
TrsOleControl = class (TOleControl)
protected
function GetIDispatchProp(Index: Integer): IDispatch;
function GetIUnknownProp(Index: Integer): IUnknown;
end;

implementation


{ TOleControlFix }

function TrsOleControl.GetIDispatchProp(Index: Integer): IDispatch;
var
Temp: TVarData;
begin
GetProperty(Index, Temp);
// Result := IDispatch(Temp.VDispatch); ***** Change to:
Pointer(Result) := Temp.VDispatch; //this avoids the extra AddRef
end;

function TrsOleControl.GetIUnknownProp(Index: Integer): IUnknown;
var
Temp: TVarData;
begin
GetProperty(Index, Temp);
// Result := IDispatch(Temp.VUnknown); ***** Change to:
Pointer(Result) := Temp.VUnknown; //this avoids the extra AddRef
end;

end.
 
后退
顶部