假设我设置了一些事件处理程序,然后我有这个循环正常工作,如果我触发事件,该函数会被触发还是会被卡住?
答案 0 :(得分:1)
Flash在大多数情况下是单线程的。这意味着它一次只能做一件事。 (你现在可以使用工人来解决这个问题,但是为了这个答案,我们会忽略那些)
因此,事件只有在执行中存在差距时才会触发。如果你有一个循环运行,那么直到那个循环之后才会出现这样的差距,并且任何其他代码都已运行。
你的问题的答案是在循环结束之前它不会运行。并且一旦执行中出现间隙,代码执行期间触发的任何事件都会按顺序排队并触发。
答案 1 :(得分:0)
如果您要在循环中调度事件,那么您的应用程序将对它们做出响应。
如果你有一个循环正在做它自己的事情而你的代码调度事件超出了那个,那么你的应用程序将不会在循环发生时获得这些事件。
在以下示例中,将分派事件:
for (var i:int;i<1000;i++) {
// do something
dispatchEvent(myEvent);
}
...不会发送事件:
for (var i:int;i<1000;i++) {
// do something
// no events dispatched while in this loop
}
dispatchEvent(myEvent);
如果您在for循环中的时间过长,则AIR或Flash Player运行时将timeout。
可能更好的方法是使用ActionScript工作人员发布另一张海报,或检查您在循环中的时间并在特定时间后突破它。然后你会把你的工作分成几块。
var landBeforeTime = getTimer();
for (var i:int;i<1000;i++) {
// do something
// check we aren't taking too long
if (getTimer()-landBeforeTime>1000){
notDone = true;
break;
}
}
if (notDone) {
// come back in the next frame and finish this loop
setTimeout (myForLoop, 100);
}
以前的代码就是一个例子。你会想要使用enterFrame并整理一下。