Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 如何在进入框架后停止actionscript中的函数_Actionscript 3_Air_Block - Fatal编程技术网

Actionscript 3 如何在进入框架后停止actionscript中的函数

Actionscript 3 如何在进入框架后停止actionscript中的函数,actionscript-3,air,block,Actionscript 3,Air,Block,在air过程中,我编写了如下函数: public function getDataFromXml():void { for each() {.....} //here may contain thounds of fields and name } 当然,这个函数可能需要10秒到20秒,所以我想添加一个progressbar,然后问题出现了,progressbar就被阻塞了。我发现一个帧大约需要40毫秒,所以原因一定是在帧间隔内执行程序,如何解决它?这个想法是为了监控在循环中花

在air过程中,我编写了如下函数:

public function getDataFromXml():void
{
    for each()
    {.....} //here may contain thounds of fields and name
}

当然,这个函数可能需要10秒到20秒,所以我想添加一个progressbar,然后问题出现了,progressbar就被阻塞了。我发现一个帧大约需要40毫秒,所以原因一定是在帧间隔内执行程序,如何解决它?

这个想法是为了监控在循环中花费的时间,如果此时间超过了允许的帧时间,则等待下一个帧

private var _dummy:Sprite = new Sprite();
private var _data:Array;

public function getDataFromXml():void
{
    var startTime:Number = getTimer();
    const allowedTime:Number = 1000 / stage.frameRate;

    while (getTimer() - startTime < allowedTime && _data.length > 0)
    {
         _data.pop(); //pop your data to remove the treated lines, or keep track of the current index
         //do your treatment here
    }
    if (_data.length == 0)
    {
       //the end
    }
    else
    {
        //wait for the next frame to go on
        _dummy.addEventListener(Event.ENTER_FRAME, onNextFrame);
    }
}

private function onNextFrame(event:Event):void
{
    _dummy.removeEventListener(Event.ENTER_FRAME, onNextFrame);
    getDataFromXml();
}
private-var\u-dummy:Sprite=new-Sprite();
私有var_数据:数组;
公共函数getDataFromXml():void
{
var startTime:Number=getTimer();
const allowedTime:Number=1000/stage.frameRate;
while(getTimer()-startTime0)
{
_data.pop();//弹出数据以删除处理过的行,或跟踪当前索引
//你在这里治疗吗
}
如果(_data.length==0)
{
//结局
}
其他的
{
//等待下一帧继续
_dummy.addEventListener(Event.ENTER_FRAME,onNextFrame);
}
}
私有函数onNextFrame(事件:事件):void
{
_dummy.removeEventListener(Event.ENTER_FRAME,onNextFrame);
getDataFromXml();
}

问题的主要原因是,尽管Flash试图按照其要求的帧速运行,但它必须在一帧内完成所有脚本执行,然后才能转到下一帧。因此,如果您的foreach需要40秒才能执行,那么在达到40秒之前,Flash将无法传递到下一帧

此问题的主要解决方案是:必须使此执行异步。 有几种方法可以做到这一点

第一种方法是把你的执行力分成更小的部分。由于您使用循环,因此通过限制循环在一帧中可以执行的步骤数,这将非常容易。基本上,它可能看起来有点像这样:

private var _getDataIndex:Number;
private var _extractedData:Array;

public function getDataFromXml():void
{
    _getDataIndex = 0;
    _extractedData = new Array();
    this.addEventListener(Event.ENTER_FRAME, getDataFromXmlStep); // You can also use a Timer instead
    for each()
    {.....} //here may contain thounds of fields and name
}

private function getDataFromXmlStep(evt:Event):void
{
  for(var i:int = 0; i < 5; i++) {
    var field:XML = _myXMLData[_getDataIndex];
    if (field == null) {
      getDataFromXmlFinished()
      break;
    }
    {.....} // your code for the field, the result saved in _extractedData
    _getDataIndex++;
  }
}
private function getDataFromXmlFinished():void {
    this.removeEventListener(Event.ENTER_FRAME, getDataFromXmlStep); // You can also use a Timer instead
    // extraction finished
}
private var\u getDataIndex:Number;
私有变量提取数据:数组;
公共函数getDataFromXml():void
{
_getDataIndex=0;
_extractedData=新数组();
this.addEventListener(Event.ENTER_FRAME,getDataFromXmlStep);//您也可以改用计时器
每()
{….}//此处可能包含多个字段和名称
}
私有函数getDataFromXmlStep(evt:Event):void
{
对于(变量i:int=0;i<5;i++){
变量字段:XML=_myXMLData[_getDataIndex];
如果(字段==null){
getDataFromXmlFinished()
打破
}
{….}//您的字段代码,结果保存在_extractedData中
_getDataIndex++;
}
}
私有函数getDataFromXmlFinished():void{
this.removeEventListener(Event.ENTER_FRAME,getDataFromXmlStep);//您也可以使用计时器代替
//提取完成
}
如果使用AIR 3.4或更高版本,另一种解决方案是使用。简单地说,您将工作委托给另一个线程,该线程不显示任何内容,而主代码执行其他操作(管理与windows的交互)。
Workers是一个值得学习的好东西,但其局限性在于您需要最新版本的AIR才能让其工作。

Workers也可以在非AIR版本中使用。*注意:仅在Flash Player和桌面平台上的AIR中支持使用Worker进行并发。移动空中平台不支持并发。在尝试使用它之前,您可以使用static isSupported属性检查是否支持并发。*是的,但是由于viger的问题是关于AIR的,所以我只给出了AIR的最低版本。对于Flash Player,它是11.4或更高。