说实话,不知为何AS3 Worker DEMO的从使用,与API命名,感觉都是与统传的计算机中的线程的概念,名称,都很不同,初次使用,如果不写个DEMO,真的不知道怎么用;
AS3 Worker DEMO项目
Sender 与 Receiver的合并使用testWorker.as是文档类用于:Sender 与 Receiver的合并使用; 建议不这么用,因为createMessageChannel的用法,很容易混淆Sender, Receiver; (只能说API设计得不用好)
分开的Sender类与Receiver类的使用Worker1.as 与 Worker2.as 分别是,主线程类,与后台线程类的用例; 这样对MessageChannel的理解上会好很多;
其次还有那个:ByteArray.shareable属性的功能,可以共享该bytes内存; 在Worker1.as与Worker2.as下分别断点信息:可以看到send(bytes), bytes = receive() as ByteArray,前、后者的bytes的断点变量地址是不一样的(这个原因是:所在的ApplicationDomain不一样,而表达式视图中,显示的:变量的地址(@xxxxxx)的就会不一样),但在整个进程程序中,他们的内存是一样的,具体看Worker1.as与Worker2.as的用例吧;
功能上与别的一些语言的线程用法、灵活度、功能,是没法比的; 将就一下使用吧。
参考官方Worker 通讯 的在线说明
快速look look大概用上的API简单说明// worker domain var workerDomain:WorkerDomain; var newWorker:Worker = workerDomain.createWorker(null); // 以指定的swf的loaderInfo.bytes来创建,可以是当前主文档类的bytes,但这样写的话,就需要在代码中加这样的判断:Worker.current.isPrimordial来区别是否当前执行时是主线程 var workerList:Vector. = workerDomain.listWorkers(); // 提供对 WorkerDomain 中当前正在运行的 worker(Worker 实例的 state 属性为 WorkerState.RUNNING)集的访问。 WorkerDomain.isSupported; // 判断当前是否支持多线程 WorkerDomain.current; // 对代表代码当前正在其中运行的实例的引用
// worker
var worker:Worker = Worker.current; // 对代码当前正在其中运行的 Worker 的引用
worker.isPrimordial; // 是否主线程
worker.state == WorkerState.NEW; // 刚刚新建,未运行
WorkerState.RUNNING; // 运行中
WorkerState.TERMINATED; // 已结束
worker.setSharedProperty("testObj", {"test":"TestValue"}); // 设置
var obj:* = worker.getSharedProperty("testObj");
worker.start(); // 开始
worker.terminate(); // 结束
worker.addEventListener(Event.WORKER_STATE, function(e:Event):void{}); // 为worker的state变化添加监听事件(callback)
// message channel
var messageChannel:MessageChannel = worker.createMessageChannel(worker);
messageChannel;
var messageChannelState:String = MessageChannelState.OPEN; // 已打开,正在使用
MessageChannelState.CLOSED; // 已关闭
MessageChannelState.CLOSING; // 关闭中,但还有剩余的数据正在传输中
messageChannel.send("test"); // 对接收方式的worker的messagechannel发送数据
var testStr:String = messageChannel.receive(); // 对发送方的数据接收
messageChannel.messageAvailable; // 判断当前是否有效数据;
messageChannel.close(); // 关闭
messageChannel.addEventListener(Event.CHANNEL_MESSAGE, function(e:Event):void{}); // 当该channel收到数据时触发
messageChannel.addEventListener(Event.CHANNEL_STATE, function(e:Event):void{}); // 当该channel的state发生变化时触发
// using Embed swf, create background worker
/*
// 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();
}
*/
// using urlLoader swf, create bgworker
/*
// 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();
}
*/