tchromium系列一直有一个问题,它的禁止下载图片选项只能在摆放控件或者第一次动态创建时设置有效,如果是动态创建的,第二次销毁后再设置禁止下载图片,不管怎么设置都会下载图片。这个是否有解?我目前的做法是打开cefgui把加载图片的选项默认值设置为禁用:
property ImageLoading: TCefState read FImageLoading write FImageLoading default STATE_DISABLED;
FImageLoading := STATE_DISABLED;
这么做的后果是,第二次动态创建时再也无法启动下载图片选项了。
再就是这个控件加载网页后的内存不会释放,会持续增加,经测试,加载3800+个网页后必然报错(libcef.dll内存读写错误,出错后哪怕销毁重建也没用,无法触发绑定的任何事件),要避免只能在3000个网页左右销毁重建,但是销毁重建后占用的内存也没被释放,并且多销毁几次会出现tchromium接不到绑定事件的破事。
tchromium内部自带了个重建浏览器的命令:
ReCreateBrowser(const url:string);
本来以为可以通过这个解决内存不释放的问题,事实证明这个命令的作用就是切断tchromium内嵌浏览器和tchromium的关联,然后再创建一个新的浏览器。证据是,使用这个命令后,网页的抓取内容动作依然在(依然可以获取到新网页的源码之类的),但是最上的这个浏览器内容不再变动,点击啥的依然能做…………而且用这个命令后,控件崩溃得更快了。
是否有什么办法能彻底销毁tchromium内嵌的浏览器控件,或者能让tchromium不再莫名其妙报内存读写错误或接不到绑定事件?求解!
附重建代码:
procedure TGetNewInfo.InitChrome(count:Integer = 0);
begin
if count = 0 then
count := 3000
else
count := iWebLoadCount;
if iWebLoadCount = count then
begin
oWeb.Parent := nil;
oWeb.OnLoadError := nil;
oWeb.OnLoadEnd := nil;
oWeb.Align := alNone;
oWeb.Free;
oWeb := TChromium.Create(nil);
oWeb.Parent := oParent;
oWeb.Options.ImageLoading := TCefState.STATE_DISABLED;
oWeb.OnLoadEnd := oChrmLoadEnd;
oWeb.OnLoadError := oChrmLoadError;
oWeb.Width := 0;
oWeb.Height := 0;
olog.pWriteLog('## 初始化浏览器 ##', iLevel);
iWebLoadCount := 0;
end;
iWebLoadCount := iWebLoadCount + 1;
end;