也许很多人用过TWebBrowser。
我今天才发现,仅仅用TWebBrowser.Navigate(FileName);没有什么问题。
但,当我程序代码中涉及到TWebBrowser.Document时,哪怕是什么都不做,当TWebBrowser控件Free后,不能完整地释放内存。当我的程序中多次创建和释放该控件后,程序占用的内存会一直增加,直至系统崩溃!
请教各位,如何解决这个问题?!procedure TForm1.Timer1Timer(Sender: TObject);
begin
DelOld;
CrtNew;
end;procedure TForm1.CrtNew;
begin
Browser := TWebBrowser.Create(Self);
TWinControl(Browser).Parent := Self;
Browser.Left := 88;
Browser.Top := 8;
Browser.Width := ClientWidth - 96;
Browser.Height := ClientHeight - 16;
Browser.Navigate(FileName);
end;procedure TForm1.DelOld;
var
doc2: IHTMLDocument2;
begin
if Assigned(Browser) then
begin
doc2 := Browser.Document as IHTMLDocument2; //将此类语句放到其它地方也一样,但没了这类语句,就一切正常。
// Browser.Document; //甚至改成这样也一样会不能释放内存
Browser.Free;
end;
end;
我今天才发现,仅仅用TWebBrowser.Navigate(FileName);没有什么问题。
但,当我程序代码中涉及到TWebBrowser.Document时,哪怕是什么都不做,当TWebBrowser控件Free后,不能完整地释放内存。当我的程序中多次创建和释放该控件后,程序占用的内存会一直增加,直至系统崩溃!
请教各位,如何解决这个问题?!procedure TForm1.Timer1Timer(Sender: TObject);
begin
DelOld;
CrtNew;
end;procedure TForm1.CrtNew;
begin
Browser := TWebBrowser.Create(Self);
TWinControl(Browser).Parent := Self;
Browser.Left := 88;
Browser.Top := 8;
Browser.Width := ClientWidth - 96;
Browser.Height := ClientHeight - 16;
Browser.Navigate(FileName);
end;procedure TForm1.DelOld;
var
doc2: IHTMLDocument2;
begin
if Assigned(Browser) then
begin
doc2 := Browser.Document as IHTMLDocument2; //将此类语句放到其它地方也一样,但没了这类语句,就一切正常。
// Browser.Document; //甚至改成这样也一样会不能释放内存
Browser.Free;
end;
end;
解决方案 »
- IdHttp显示中文网页的出现乱码问题
- 招delphi程序员,成都
- 请问如何用ord(),为什么我写的出来的代码有错了,请帮助.
- 熟悉dbgrideh 的朋友帮个忙吧!!!!!
- SQL Server在存储jpg图像后,对图像字段进行修改就不起作用了......
- 做过KTV点歌系统的朋友请进!(请各位好心的大富翁帮帮忙吧。要分要RMB都可以商量)
- 如下写以下特殊的主细表关联sql?
- 使用selectdirectory('选择文件夹','',s)打开选择文件夹对话框,怎么使对话框居中显示?
- 即将去长沙面试程序员,想问长沙的相关情况。100‘
- 再问问!来着有分!
- 水晶报表编程 绝对的难题!
- ADOQuery1 传参,参数没有起作用
http://support.microsoft.com/kb/893629/en-us
看了一下,还是不知道怎么做,可能是我英文水平太低了吧,最后一句:
If you try to replace that interface by using the ICustomDoc interface, you may experience unexpected behavior.
不知什么意思,是不是用ICustomDoc就能解决呢?如果用ICustomDoc,又怎么做呢,如何编程?
太底层了,不懂啊!
或者,还是我们使用不当,是不是要显式地手工释放内存?又如何做?
根据程序运行时观察VCL的内存管理器,它分配的内存并没有增加. 显然MS的WEBBROWSER内部分配的问题,而且有WINDOWS句柄未释放现象.确实是麻烦的问题,继续关注
谢谢关注!to: agui(阿贵: 高级图形用户界面)
这个网址我上过,可是看不懂,英文版的也看过了,也看不懂,不知怎么解决,能讲解一下吗?(请原谅我的愚钝)
浏览器控件会保存页面状态,这对需要回退到上一个页面的用户很有效,但是对程序来说并无意义。
另外,javascipt引擎的垃圾回收机制也可能会造成自动浏览时内存占用不断上升。
难道要我的程序运行一段时间自动重启?这样客户看来不会太满意吧!
不过,这不失为一个大胆有创意的想法。如果能找出哪一块内存是被无故占用的,想办法释放掉,应该也可以的。只是,我不会做啊。
var
doc2: IHTMLDocument2;
intf: IWebBrowser2;// code片段
intf := Browser.DefaultInterface;
doc2 := intf.Document as IHTMLDocument2;
// 取得HTML体的文本(注意:innerText不W3C标准,是微软/IE自己的)
Memo1.Text := doc2.body.innerText;另外,我建议在执行其它的语句前,先等WebBrowser喘口气,否则有时候会报错:
Browser.Navigate('http://www.agui.googlepages.com');
while Browser.Busy do
Application.ProcessMessages;
--
http://www.agui.googlepages.com
mailto: agui.cn(a)gmail.com
你的办法确实很有效,试了一个小时,内存占用情况比原来的大大减少,但是,仍然会有少量的内存占用增加,只是慢了很多,不注意看一下还看不出。如果没有其它更好的办法,看来只能这样了。谢谢你了。to: jiangsheng(蒋晟.Net[MVP])
这个函数还不知道怎么用,还要仔细研究研究,看看能不能帮助解决这个问题。谢谢