近来写代码的时候,常常会担心代码的执行顺序,例如某个函数是否会被事件处理函数打断之类的,百度了一下,无果(这个已经早就预料到的了),关键时候还是得翻出我的英语老底,投靠google吧。
以下是我自己设计的测试场景:
测试场景1:
假设有类ExecutionTest, 代码如下:
package com.longpeijin.exec
{
import flash.display.Sprite;
import flash.events.Event;
public class ExecutionTest extends Sprite
{
public function ExecutionTest()
{
var obj:SystemHandler = new SystemHandler(this,"1");
var obj1:SystemHandler = new SystemHandler(this,"2");
this.dispatchEvent(new Event(SystemHandler.SYS_EVENT));
trace("Main function executed!");
}
}
}
和另外一个类SystemHandler:
package com.longpeijin.exec
{
import flash.events.Event;
import flash.events.EventDispatcher;
public class SystemHandler
{
public static const SYS_EVENT:String = "sysEvent";
private var name:String;
public function SystemHandler(obj:EventDispatcher, name:String)
{
obj.addEventListener(SYS_EVENT,onEvent);
this.name = name;
}
public function onEvent(event:Event):void{
trace("event handler executed! " + name);
}
}
}
简单来说就是ExecutionTest类的某个方法在执行的过程中发布了一次事件,紧接着其后又执行了一些代码,那么监听这个事件的事件处理程序会马上执行还是等待ExecutionTest执行完毕才执行呢?
输出结果如下:
event handler executed! 1
event handler executed! 2
Main function executed!
结果可以知道,在执行过程中发布一次时间,其实就是在事件监听链条上逐个执行事件处理程序,然后再返回主函数,跟普通的函数调用没有两样!
所以ExecutionTest类的构造函数等价于以下的样子:
package com.longpeijin.exec
{
import flash.display.Sprite;
import flash.events.Event;
public class ExecutionTest extends Sprite
{
public function ExecutionTest()
{
var obj:SystemHandler = new SystemHandler(this,"1");
var obj1:SystemHandler = new SystemHandler(this,"2");
obj.onEvent(null);
obj1.onEvent(null);
trace("Main function executed!");
}
}
}
测试场景2:
另外一个我想知道的问题就是,假如有一个函数正在执行一个比较耗时的操作,这时候其他的一个对象发出了一次事件(例如一个网络资源下载完成了),而自身也有监听这个事件,那么这时当前函数的执行会被打断么?
于是我设计了以下的类EventTest:
package com.longpeijin.event
{
import flash.display.Loader;
import flash.display.MovieClip;
import flash.events.Event;
import flash.net.URLRequest;
public class EventTest extends MovieClip
{
public function EventTest()
{
super();
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
loader.load(new URLRequest("http://www.evolife.cn/wp-content/uploads/2010/06/iphone4display3.jpg"));
this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
this.stage.frameRate = 20;
}
private function onEnterFrame(event:Event):void{
trace("On Enter frame start!");
//do something time consuming
var arr:Array = [];
for(var i:int;i<10000;i++){
arr.push(Math.random());
}
for each(var num:int in arr){
Math.sqrt(num*100);
}
trace("On Enter frame end!");
}
private function onComplete(event:Event):void{
trace("Resouces loaded!");
}
}
}
为了排除网络速度因素,我执行了该类10次,但每次的输出都有一个固定的片段:
On Enter frame start!
On Enter frame end!
Resouces loaded!
On Enter frame start!
On Enter frame end!
Resouces loaded!没有一次出现在On Enter frame start!和On Enter frame end!之间,换句话说,函数从来没有被打断过。
之前也求教过一些高手,得知Flash的代码执行线程只有一个(这里指的是执行代码的线程,不包括下载网络资源的那些线程),有点类似底层CPU的时间片轮转执行,但轮转的并不是线程(因为主线程只有一个),而是各个对象的事件处理函数(Timer事件,Event.Complete事件,KeyboardEvent之类的),所以AVM的执行完全是事件驱动的。即使主MovieClip的构造函数(类似于Java中的main方法)执行完毕,程序不会像普通Java程序那样直接退出,而是空闲着等待着事件的发生,而且函数的执行是原子性的,任何时候不会被打断(除非AVM被崩掉或者你叉掉浏览器啦)。
换个角度来看Flash是不支持多线程的,所以6核、双核、单核的CPU执行起来,都只会用到其中的一个核心而已。
上面的探讨如有任何错误或疑惑,欢迎回复指正和讨论。
分享到:
相关推荐
ActionScript3提供 ENTER_FRAME 事件,用于在每帧开始时执行指定的函数,实现游戏的连续更新。 4. **碰撞检测**:贪吃蛇游戏中,蛇与自身、边界以及食物的碰撞检测是关键。这通常通过比较坐标和尺寸来实现,可以...
3. **事件驱动编程**:ActionScript3.0中的事件模型对于构建交互性应用至关重要。源代码可能包含了各种事件监听器和事件处理函数的实现,帮助开发者了解如何处理用户输入和其他触发的事件。 4. **网络通信**:由于...
ActionScript3的事件处理机制在此发挥关键作用,例如,当玩家点击作物时,会触发相应的事件处理器进行收割操作。此外,游戏可能还包含了时间系统,模拟作物生长和动物饲养的过程。 六、资源管理与音效 在源代码中...
这个"actionscript3-example"压缩包包含了几个ActionScript3的实例代码,旨在帮助开发者理解和学习ActionScript3的基本概念和特性。 1. **基础语法**:ActionScript3采用了严格的面向对象编程(OOP)模型,与AS2...
3. **事件处理**:AS3的事件驱动模型使得代码能够响应用户输入或系统状态变化。事件通过`Event`类及其子类表示,`addEventListener`和`removeEventListener`用于注册和移除事件监听器,`dispatchEvent`发送事件。 4...
5. **优化的性能**:AS3.0的代码执行速度比AS2.0快很多,使得它更适合开发大型应用和复杂的互动内容。 在开发本地播放器时,ActionScript 3.0通常会利用Adobe Flex框架,Flex提供了一套丰富的组件库和MXML标记语言...
第五章通常会涵盖事件处理和监听器,这是ActionScript中实现用户交互的关键部分。通过监听用户行为,如鼠标点击或键盘输入,我们可以编写响应这些事件的代码,从而使Flash内容更加动态。 第六章可能讨论面向对象...
4. **事件驱动编程**:AS3中的事件处理机制是其核心部分,通过事件监听器和事件发射器,开发者可以响应用户交互或其他组件的状态改变。 5. **组件库**:ActionScript 3.0 配有一系列预定义的UI组件,如按钮、列表和...
在"ActionScript3_jb51.net.rar"这个压缩包中,很可能包含了jb51.net网站上整理的关于ActionScript3的教程、代码示例和学习指南。 ActionScript3是ActionScript的重大升级版本,它与之前的版本相比,具有许多显著的...
2. **事件驱动模型**:AS3中的事件处理机制允许程序对用户交互和其他事件做出响应。事件监听器、事件对象和事件类型是这一模型的关键组成部分。 3. **强类型系统**:与AS2相比,AS3具有更严格的类型检查,有助于...
4. **性能优化**:AS3提供了一些工具和技术来提高代码执行效率,比如使用局部变量、减少函数调用等。 5. **动画与图形**:利用AS3,开发者可以轻松创建复杂的动画效果和绘制自定义图形。 #### 六、Flash CS3与...
AS3是事件驱动的,这意味着程序的执行基于用户交互或系统事件。事件监听器注册到特定的对象上,当事件发生时,监听器的回调函数会被调用。例如,使用addEventListener方法添加事件监听器,然后通过dispatchEvent方法...
- **事件模型**:ActionScript 3.0采用事件驱动编程,事件发生时会触发相应的事件处理函数。 - **事件监听器**:添加事件监听器到对象,以便在特定事件发生时执行代码。 - **常见事件**:例如鼠标点击(click)、...
4. **事件驱动编程**:AS3中的事件模型是基于观察者模式的,允许对象之间通过事件进行通信。常见的事件有点击事件(click)、加载完成事件(complete)等,使用addEventListener和removeEventListener方法来添加和...
1. **MXML与ActionScript 3的交互**:Flex使用MXML(Flex Markup Language)来定义界面布局和组件属性,而ActionScript 3则负责编写业务逻辑代码。两者通过事件机制进行通信,实现了数据驱动的动态界面。 2. **组件...
4. 事件驱动编程:ActionScript 3.0的事件模型是其核心部分,使用`Event`类和`addEventListener`、`dispatchEvent`等方法处理用户交互和其他事件。 5. 包(Package)系统:AS3.0引入了包的概念,允许将相关类组织在...
总之,基于ActionScript 3.0的本地播放器开发涉及到多媒体处理、事件机制、用户界面设计等多个方面,通过灵活运用AS3提供的类库和API,可以创建出功能强大且用户体验良好的本地视频播放解决方案。
ActionScript3.0的性能相较于AS2显著提升,因为AS3的代码被编译成字节码,而非AS2的解释执行。这使得AS3更适合创建复杂的交互性和高性能的应用程序。 `ActionScript3.0语言和组件参考.中文版.chm`这个文件包含了...
例如,当用户点击播放按钮时,会产生一个“click”事件,播放器代码通过监听这个事件并执行相应的播放函数。 2. **媒体类库**:AS3提供了一系列的Media类,如Sound和Video类,用于加载和播放音频和视频文件。开发者...
- **ENTER_FRAME事件**:利用这个事件可以在每一帧开始时执行代码,是制作动画的常用方式。 - **Timer类**:定时器可用于创建间隔性的动画效果,独立于时间轴。 7. **源码解析** "FoundationAS3Animation"很可能...