Actionscript 3 - 处理事件是不是与函数分开工作

Posted

技术标签:

【中文标题】Actionscript 3 - 处理事件是不是与函数分开工作【英文标题】:Actionscript 3 - Does handling an event work separately than a functionActionscript 3 - 处理事件是否与函数分开工作 【发布时间】:2016-03-16 14:51:00 【问题描述】:

假设我设置了一些事件处理程序,然后我有这个正在工作的循环,如果我触发事件,函数会被触发还是会卡住?

【问题讨论】:

不看实际代码就无法回答你的问题。 致点击“关闭”的人。不要投票关闭它。要求清楚。 【参考方案1】:

Flash 在大多数情况下是单线程的。这意味着它一次只能做一件事。 (您现在可以使用 Workers 来解决这个问题,但为了这个答案,我们将忽略这些)

因此,只有在执行中有间隙时才会触发事件。如果您有一个循环正在运行,那么在该循环和任何其他代码运行之前不会有这样的差距。

您的问题的答案是在循环完成之前它不会运行。并且在代码执行期间触发的任何事件都会在执行间隙发生时排队并按顺序触发。

【讨论】:

感谢您的回答,但您能否为我提供一个关于工人如何工作的简短示例(在主 SWF 中)? @icecreamscoop Workers 与其他平台的线程非常不同。您应该用您实际尝试做的事情来更新您的问题 - 如果您开始运行循环并引发事件,那么工作人员不太可能成为答案。 @icecreamscoop 我实际上不能。我自己从未使用过Workers,只是阅读它们。它们与其他平台上的线程具有相似的结果,但如果我没记错的话,它们的行为完全不同并且有不同的目的。 基本上我是连接到一个socket服务器并使用while循环从服务器接收数据,同时我还需要在触发事件时将数据分别发送到同一台服务器。 @icecreamscoop 请使用该信息和您正在使用的代码更新您的问题。没有这些就无法回答。【参考方案2】:

如果您在循环中调度事件,那么您的应用程序将响应它们。

如果您有一个循环在做它自己的事情,而您调度事件的代码不在此范围内,那么您的应用程序在循环发生时将不会收到这些事件。

在以下示例中,将分派事件:

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 并整理东西。

【讨论】:

以上是关于Actionscript 3 - 处理事件是不是与函数分开工作的主要内容,如果未能解决你的问题,请参考以下文章

Actionscript 3 - 如何在删除该事件后保留该事件的值

使用actionscript 3的触摸事件与鼠标单击事件

ActionScript 2 事件的最佳实践 - 有没有模拟 ActionScript 3 样式事件的方法?

(ActionScript 3.0)我的函数没有通过按钮事件更新全局变量

ActionScript 3 ActionScript 3.0计时器事件

ActionScript 3 使用Actionscript 3的onEnterFrame事件