`
peijinlong
  • 浏览: 32073 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

关于Actionscript3的事件驱动代码执行机制

阅读更多
    近来写代码的时候,常常会担心代码的执行顺序,例如某个函数是否会被事件处理函数打断之类的,百度了一下,无果(这个已经早就预料到的了),关键时候还是得翻出我的英语老底,投靠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执行起来,都只会用到其中的一个核心而已。

    上面的探讨如有任何错误或疑惑,欢迎回复指正和讨论。
分享到:
评论
1 楼 smithfox 2011-02-08  
"换个角度来看Flash是不支持多线程的,所以6核、双核、单核的CPU执行起来,都只会用到其中的一个核心而已。 "

这个好象不是这样的!!!

相关推荐

    ActionScript3小游戏-贪吃蛇

    ActionScript3提供 ENTER_FRAME 事件,用于在每帧开始时执行指定的函数,实现游戏的连续更新。 4. **碰撞检测**:贪吃蛇游戏中,蛇与自身、边界以及食物的碰撞检测是关键。这通常通过比较坐标和尺寸来实现,可以...

    Yahoo 开发中心ActionScript3.0类源代码

    3. **事件驱动编程**:ActionScript3.0中的事件模型对于构建交互性应用至关重要。源代码可能包含了各种事件监听器和事件处理函数的实现,帮助开发者了解如何处理用户输入和其他触发的事件。 4. **网络通信**:由于...

    flash actionscript3游戏 开心农场2 源代码.zip

    ActionScript3的事件处理机制在此发挥关键作用,例如,当玩家点击作物时,会触发相应的事件处理器进行收割操作。此外,游戏可能还包含了时间系统,模拟作物生长和动物饲养的过程。 六、资源管理与音效 在源代码中...

    actionscript3例子

    这个"actionscript3-example"压缩包包含了几个ActionScript3的实例代码,旨在帮助开发者理解和学习ActionScript3的基本概念和特性。 1. **基础语法**:ActionScript3采用了严格的面向对象编程(OOP)模型,与AS2...

    ActionScript 3.0编程精髓

    3. **事件处理**:AS3的事件驱动模型使得代码能够响应用户输入或系统状态变化。事件通过`Event`类及其子类表示,`addEventListener`和`removeEventListener`用于注册和移除事件监听器,`dispatchEvent`发送事件。 4...

    本地播放器(ActionScript3.0)

    5. **优化的性能**:AS3.0的代码执行速度比AS2.0快很多,使得它更适合开发大型应用和复杂的互动内容。 在开发本地播放器时,ActionScript 3.0通常会利用Adobe Flex框架,Flex提供了一套丰富的组件库和MXML标记语言...

    ActionScript 2.0编程入门经典 例程

    第五章通常会涵盖事件处理和监听器,这是ActionScript中实现用户交互的关键部分。通过监听用户行为,如鼠标点击或键盘输入,我们可以编写响应这些事件的代码,从而使Flash内容更加动态。 第六章可能讨论面向对象...

    ActionScript3中文帮助

    4. **事件驱动编程**:AS3中的事件处理机制是其核心部分,通过事件监听器和事件发射器,开发者可以响应用户交互或其他组件的状态改变。 5. **组件库**:ActionScript 3.0 配有一系列预定义的UI组件,如按钮、列表和...

    ActionScript3_jb51.net.rar

    在"ActionScript3_jb51.net.rar"这个压缩包中,很可能包含了jb51.net网站上整理的关于ActionScript3的教程、代码示例和学习指南。 ActionScript3是ActionScript的重大升级版本,它与之前的版本相比,具有许多显著的...

    ActionScript_3 编程

    2. **事件驱动模型**:AS3中的事件处理机制允许程序对用户交互和其他事件做出响应。事件监听器、事件对象和事件类型是这一模型的关键组成部分。 3. **强类型系统**:与AS2相比,AS3具有更严格的类型检查,有助于...

    Foundation ActionScript 3.0 with Flash CS3 and Flex.pdf

    4. **性能优化**:AS3提供了一些工具和技术来提高代码执行效率,比如使用局部变量、减少函数调用等。 5. **动画与图形**:利用AS3,开发者可以轻松创建复杂的动画效果和绘制自定义图形。 #### 六、Flash CS3与...

    ActionScript 3.0开发编程手册中文

    AS3是事件驱动的,这意味着程序的执行基于用户交互或系统事件。事件监听器注册到特定的对象上,当事件发生时,监听器的回调函数会被调用。例如,使用addEventListener方法添加事件监听器,然后通过dispatchEvent方法...

    ActionScript3.0入门基础

    - **事件模型**:ActionScript 3.0采用事件驱动编程,事件发生时会触发相应的事件处理函数。 - **事件监听器**:添加事件监听器到对象,以便在特定事件发生时执行代码。 - **常见事件**:例如鼠标点击(click)、...

    ActionScript 3.0 开发人员指南

    4. **事件驱动编程**:AS3中的事件模型是基于观察者模式的,允许对象之间通过事件进行通信。常见的事件有点击事件(click)、加载完成事件(complete)等,使用addEventListener和removeEventListener方法来添加和...

    Flex与ActionScript 3程序开发

    1. **MXML与ActionScript 3的交互**:Flex使用MXML(Flex Markup Language)来定义界面布局和组件属性,而ActionScript 3则负责编写业务逻辑代码。两者通过事件机制进行通信,实现了数据驱动的动态界面。 2. **组件...

    Essential ActionScript 3.0.zip

    4. 事件驱动编程:ActionScript 3.0的事件模型是其核心部分,使用`Event`类和`addEventListener`、`dispatchEvent`等方法处理用户交互和其他事件。 5. 包(Package)系统:AS3.0引入了包的概念,允许将相关类组织在...

    基于ActionScript 3.0本地播放器

    总之,基于ActionScript 3.0的本地播放器开发涉及到多媒体处理、事件机制、用户界面设计等多个方面,通过灵活运用AS3提供的类库和API,可以创建出功能强大且用户体验良好的本地视频播放解决方案。

    ActionScript3.0中文语言参考chm版

    ActionScript3.0的性能相较于AS2显著提升,因为AS3的代码被编译成字节码,而非AS2的解释执行。这使得AS3更适合创建复杂的交互性和高性能的应用程序。 `ActionScript3.0语言和组件参考.中文版.chm`这个文件包含了...

    本地播放器(ActionScript 3.0实现)

    例如,当用户点击播放按钮时,会产生一个“click”事件,播放器代码通过监听这个事件并执行相应的播放函数。 2. **媒体类库**:AS3提供了一系列的Media类,如Sound和Video类,用于加载和播放音频和视频文件。开发者...

    Flash Flash actionscript 3.0 动画教程源码

    - **ENTER_FRAME事件**:利用这个事件可以在每一帧开始时执行代码,是制作动画的常用方式。 - **Timer类**:定时器可用于创建间隔性的动画效果,独立于时间轴。 7. **源码解析** "FoundationAS3Animation"很可能...

Global site tag (gtag.js) - Google Analytics