hongqizhen 2018-01-16 05:59 采纳率: 0%
浏览 1234
已结题

关于tchromium的一些疑惑

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;

  • 写回答

2条回答 默认 最新

  • devmiao 2018-01-16 14:23
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 写论文,需要数据支撑
  • ¥15 identifier of an instance of 类 was altered from xx to xx错误
  • ¥100 反编译微信小游戏求指导
  • ¥15 docker模式webrtc-streamer 无法播放公网rtsp
  • ¥15 学不会递归,理解不了汉诺塔参数变化
  • ¥15 基于图神经网络的COVID-19药物筛选研究
  • ¥30 软件自定义无线电该怎样使用
  • ¥15 R语言mediation包做中介分析,直接效应和间接效应都很小,为什么?
  • ¥15 Jenkins+k8s部署slave节点offline
  • ¥15 如何实现从tello无人机上获取实时传输的视频流,然后将获取的视频通过yolov5进行检测