11RIA 闪客社区 - 最赞 Animate Flash 论坛

搜索
查看: 2307|回复: 3
上一主题 下一主题

[AS 基础知识] ActionScript Workers 并发【AIR】

[复制链接] TA的其它主题
发表于 2017-11-23 15:14:55 | 显示全部楼层 |阅读模式

【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
flash.system
public final class Worker
继承

语言版本: ActionScript 3.0
运行时版本: Flash Player 11.4, AIR 3.4


   






Worker 对象代表一个 worker,这是 Flash 运行时的虚拟实例。每个 Worker 实例控制并提供对单个 worker 的生命周期和共享数据的访问。
worker 允许您在另一个 worker(包括主 swf 的 worker)正在运行其他操作的同时“在后台”执行代码。在非 worker 上下文中,某些操作(例如循环处理一大组数据)要花费很长时间来执行,因此它们会妨碍主应用程序线程足够快地更新屏幕。这可能会导致屏幕延迟或冻结。
使用 worker 可允许您在后台执行长时间运行的或慢速的操作。每个 worker 都在独立于其他 worker 的一个单独的执行线程中运行自己的代码。一个 worker 中的长时间运行代码不会阻止另一个 worker 中的代码执行。相反,两组代码可以并行运行。因此,可以使用一个 worker 在后台执行代码,同时主应用程序线程仍然能够自由地继续更新屏幕。
同时执行多组代码指令的这一功能称为并发
注意:在桌面平台上,Flash Player 和 AIR 均支持使用 worker 实现并发。对于移动平台,AIR Android 和 iOS 均支持并发。在尝试使用并发之前,您可以使用 isSupported 静态属性来检查是否支持并发。
不要通过调用 Worker() 构造函数来直接创建 Worker 实例。在支持使用 worker 实现并发的上下文中,在启动时运行时会自动创建与主 SWF 关联的 Worker(称为原始 worker)。
每个额外的 worker 都是基于一个单独的 swf 创建的。要创建 Worker 类的新实例,请将一个 ByteArray(其中包含后台 worker 的 swf 的字节)作为参数传递给 WorkerDomain 类的 createWorker()方法。针对此目的,有三种常用方式可用来访问 swf 的字节:
  • 使用 [Embed] 元标记将 .swf 文件作为 ByteArray 嵌入在应用程序中:

    // Embed the SWF file [Embed(source="../swfs/BgWorker.swf", mimeType="application/octet-stream")] private static var BgWorker_ByteClass:Class;  private function createWorker():void {   // create the background worker   var workerBytes:ByteArray = new BgWorker_ByteClass();   var bgWorker:Worker = WorkerDomain.current.createWorker(workerBytes);      // listen for worker state changes to know when the worker is running   bgWorker.addEventListener(Event.WORKER_STATE, workerStateHandler);      // set up communication between workers using    // setSharedProperty(), createMessageChannel(), etc.   // ... (not shown)      bgWorker.start(); }
  • 使用 URLLoader 加载外部 SWF 文件:

    // load the SWF file var workerLoader:URLLoader = new URLLoader(); workerLoader.dataFormat = URLLoaderDataFormat.BINARY; workerLoader.addEventListener(Event.COMPLETE, loadComplete); workerLoader.load(new URLRequest("BgWorker.swf"));  private function loadComplete(event:Event):void {   // create the background worker   var workerBytes:ByteArray = event.target.data as ByteArray;   var bgWorker:Worker = WorkerDomain.current.createWorker(workerBytes);      // listen for worker state changes to know when the worker is running   bgWorker.addEventListener(Event.WORKER_STATE, workerStateHandler);      // set up communication between workers using    // setSharedProperty(), createMessageChannel(), etc.   // ... (not shown)      bgWorker.start(); }
  • 将单个 swf 同时用作原始 worker 和后台 worker:

    // The primordial worker's main class constructor public function PrimordialWorkerClass() {   init(); }  private function init():void {   var swfBytes:ByteArray = this.loaderInfo.bytes;      // Check to see if this is the primordial worker   if (Worker.current.isPrimordial)       {     // create a background worker     var bgWorker:Worker = WorkerDomain.current.createWorker(swfBytes);          // listen for worker state changes to know when the worker is running     bgWorker.addEventListener(Event.WORKER_STATE, workerStateHandler);          // set up communication between workers using      // setSharedProperty(), createMessageChannel(), etc.     // ... (not shown)          bgWorker.start();   }   else // entry point for the background worker   {     // set up communication between workers using getSharedProperty()     // ... (not shown)          // start the background work   } }

Worker 彼此独立地执行并且不访问相同的内存、变量和代码。不过,有三种机制可用来在 Worker 实例之间传递消息和数据:
  • 共享属性:每个 worker 都有可以从该 worker 自身及其他 worker 设置和读取的一组内部命名值。您可以使用 setSharedProperty() 方法来设置值并使用 getSharedProperty() 方法来读取值。
  • MessageChannel:MessageChannel 对象允许您将单向消息和数据从一个 worker 发送到另一个 worker。接收 worker 中的代码可以侦听当有消息到达时要通知的事件。要创建 MessageChannel 对象,请使用 createMessageChannel() 方法。
  • 可共享 ByteArray:如果 ByteArray 对象的 shareable 属性为 true,则所有 worker 中该 ByteArray 的实例都使用相同的底层内存。由于多个 worker 中的代码可以同时访问共享内存,因此您的代码应使用 ByteArray.shareable 属性说明中描述的机制,以避免发生数据意外更改问题。
在后台 worker 中运行的代码中,有多个运行时 API 不可用。这主要包括与用户输入和输出机制相关的 API,或者与操作系统元素(例如窗口和拖拽)相关的 API。作为一个规则,对于不是在所有上下文中都受支持的任何 API,在尝试使用该 API 之前,请使用 isSupported、available和类似属性来检查该 API 在后台 worker 上下文中是否可用。
注意:本机扩展不支持背景和辅助 worker。
Worker 非常有用,因为它们降低了帧速率由于主渲染线程被其他代码阻止而下降的几率。不过,worker 需要使用额外的系统内存和 CPU,这可能会影响总体应用程序性能。每个 worker 都使用自己的运行时虚拟机实例,因此即便是一个微小的 worker,其开销也可能很大。当使用 worker 时,请在您的所有目标平台上测试您的代码以确保对系统的需求不是太大。在典型情况下,Adobe 建议您使用的后台 worker 不要超过一个或两个。


以上copy自as3.0 api

 楼主| 发表于 2017-11-23 15:16:50 | 显示全部楼层
AIR环境下可以通过这个worker实现多线程效果,让运算和画面渲染实现分开处理。
回复

使用道具 举报

 楼主| 发表于 2017-11-23 15:18:09 | 显示全部楼层
随手想发点啥,突然想到这个了,就顺手发一下。有兴趣的可以去API里搜索worker看看,自己写点demo试一试。对于使用air开发移动端产品会有帮助。
回复

使用道具 举报

发表于 2017-11-24 14:05:04 | 显示全部楼层
这个多线程坑很大
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)



快速回复 返回顶部 返回列表