php - SetInterval() 泄漏内存,导致加载图像时出现问题

标签 php mysql actionscript-3 setinterval memory-leaks

我制作了一个 Flash 应用程序,显示来自连接到 mysql 数据库的 php 脚本的 9 行(个人资料信息、图像)。此应用程序每 3 秒刷新一次(因为它已连接到数据库,并且需要刷新此脚本才能查看任何更改,而无需刷新整个页面)

第一个问题是,如果我删除此代码,图像将立即显示,但尺寸不同(这是一个问题)。 如果我添加这部分代码,图像将以正确的尺寸显示,但它们会在 3 秒内出现(这是另一个问题)。

clipname.Main.addChild(thumb);
clipname.Main.width=200
clipname.Main.height=200
clipname.Main.x=clipname.Main.y=60

我想要的是图像必须立即显示并具有设定的尺寸。

第二个问题是 SetInterval() 泄漏了一些内存:(

这是我的完整代码:

import flash.net.URLRequest;
import flash.net.URLVariables;
import flash.net.sendToURL;
import flash.events.Event;

var req:URLRequest=new URLRequest("proyectos.php");
var loader:URLLoader = new URLLoader();
loader.dataFormat=URLLoaderDataFormat.VARIABLES;
loader.load(req);
loader.addEventListener(Event.COMPLETE, loadCompleteHandler);

var myInterval = setInterval(loadedd, 3000);
setInterval(myInterval,0);

function loadedd() {

var req:URLRequest=new URLRequest("proyectos.php");
var loader:URLLoader = new URLLoader();
loader.dataFormat=URLLoaderDataFormat.VARIABLES;
loader.load(req);
loader.addEventListener(Event.COMPLETE, loadCompleteHandler);

}

function loadCompleteHandler(e:Event):void {
var variable:URLVariables=new URLVariables(e.target.data);
for (var i:int = 0; i <= 8; i++){

var clipname=this["Menuuser"+i]
this["foto"+i]=String(variable.foto[i]);
this["Menuuser"+i].nombre.text=String(variable.nombre[i]);
this["Menuuser"+i].nick.text=String(variable.nick[i]);
this["Menuuser"+i].email.text=String(variable.email[i]);
this["Menuuser"+i].aparea.text=String(variable.aparea[i]);
this["Menuuser"+i].motivos.text=String(variable.motivos[i]);
this["Menuuser"+i].comentario.text=String(variable.comentario[i]);
this["Menuuser"+i].fecha.text=String(variable.fecha);

var thumb:Loader = new Loader();
thumb.load(new URLRequest(this["foto"+i]));
//Here is the problem, when i put this code the images will appear in 3 seconds(i dont want that. But if i remove that part the images will be shown instantly(good) but it will appear with different dimensions(here the problem)

clipname.Main.addChild(thumb);
clipname.Main.width=200
clipname.Main.height=200
clipname.Main.x=clipname.Main.y=60

 }
}

最佳答案

按照 adobe 的建议:

考虑创建一个具有指定时间间隔的 Timer 对象,而不是使用 setInterval() 方法,并使用 0 作为 RepeatCount 参数(将计时器设置为无限重复)。

如果您打算使用clearInterval()方法取消setInterval()调用,请务必将setInterval()调用分配给一个变量(clearInterval()函数稍后将引用该变量)。如果不调用clearInterval()函数来取消setInterval()调用,则包含设置超时关闭函数的对象将不会被垃圾回收。

我运行了 setInterval 的一个版本,没有发现内存泄漏(显然没有使用 clearInterval())

private var interval:uint = setInterval( intervalTest, 3000 );

我的结果如下:

运行1总内存:3837952

运行2总内存:4427776

运行3总内存:4427776

并且这种情况会继续下去,不会出现内存泄漏。尽管我不确定您的代码是如何运行的,因为它包含一个错误:

var myInterval = setInterval(loadedd, 3000);
setInterval(myInterval,0); //this line, setInterval params are function, delay, 
//you are passing setInterval "myInterval" which is actually of type uint

我怀疑错误的代码可能是“泄漏”的来源。

使用计时器的示例如下所示:

private var timer:Timer = new Timer( 3000, 0 );
timer.addEventListener( TimerEvent.TIMER, loadedd );

然后将 loadded() 定义更改为:

function loadedd( e:TimerEvent )

至于图像的问题,我不太确定。

关于php - SetInterval() 泄漏内存,导致加载图像时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21371586/

相关文章:

php - 用 php 执行 awk linux 命令

c# - 我可以将变量从 php 获取到我的 Windows 窗体吗?

php - 安装 PECL 失败,未找到 raphf.so

flash as3 使用 curveTo 绘制一个 donut 楔形(具有内外半径的圆弧)

php - 登录后看不到我的网站

php - 使用 join 命令 Codeigniter 不同的城市值

mysql - 错误 1044 (42000) : Access denied for user '' @'localhost' to database 'db'

php - 我如何调试为什么最简单的 MySQL 查询返回 false?

ios - Geolocation.requestPermission() 只工作一次

actionscript-3 - Flash AS3函数跟踪相同的值