我试图在delphi中构建一个允许用户使用谷歌地图的系统.一切正常,但我注意到每次创建一个新的TWebBrowser对象并加载处理谷歌地图的javascript时,会生成许多新的线程.
我的问题是,即使web浏览器被销毁(并且它被明确销毁),创建的线程仍然存在.我正在设计这个程序有很长的运行时间和谷歌地图的打开和关闭发生多次,因此,一段时间后,生成了很多线程,并没有终止该程序显着减慢.
有没有办法自己销毁这些线程,或者我做错了什么导致线程持续存在?
我的程序基于以下代码:
const
HTMLStr: AnsiString =
'<html> '+
'<head> '+
'<meta name="viewport" content="initial-scale=1.0, user-scalable=yes" /> '+
'<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true"> </script> '+
'<script type="text/javascript"> '+
''+
''+
' var geocoder; '+
' var map; '+
' var trafficLayer;'+
' var bikeLayer;'+
' var markersArray = [];'+
''+
''+
' function initialize() { '+
' geocoder = new google.maps.Geocoder();'+
' var latlng = new google.maps.LatLng(40.714776,-74.019213); '+
' var myOptions = { '+
' zoom: 13, '+
' center: latlng, '+ …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,用于TWebbrowser定期导航到特定的 URL 并提取一些数据。该应用程序保持 24x7 全天候运行,并在页面中进行大量导航。
问题是TWebbrowser有一个众所周知的内存泄漏问题,每次导航到一个新页面时,应用程序使用的内存都会增加。一段时间后,我的应用程序可以轻松使用超过 2GB 的 RAM。在导航数百次之后,抛出一个'Out of memory'or'Out of system resources'异常,解决它的唯一方法是重新启动应用程序。
奇怪的是FASTMM从来没有显示这些泄漏。当我使用我的应用程序几分钟并关闭它时,没有任何报告。
多年来,我一直在寻找解决此问题的方法(实际上自 2007 年我编写应用程序的第一个版本以来)。有一些解决方法,但实际上,它们都不能解决问题。对我来说,唯一的解决方法是定期关闭和打开应用程序。
我已经测试了该SetProcessWorkingSetSize方法,但它只是暂时缩小了应用程序使用的内存。几秒钟后,该应用程序再次使用大量内存。
我也试过EmbeddedWB,但随着它的下降TWebbrowser,它受到同样问题的困扰。
顺便说一句,我不能使用像 那样简单的组件IdHTTP,因为我需要在访问的网站中进行一些 JavaScript 操作。
有谁知道这个问题是否真的有解决方案?
delphi ×2
twebbrowser ×2
delphi-2007 ×1
google-maps ×1
iwebbrowser2 ×1
javascript ×1
memory-leaks ×1