AS3 Worker DEMO

来源:互联网 发布:linux c udp socket 编辑:程序博客网 时间:2024/05/29 12:06

说实话,不知为何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();        }        */

0 0
原创粉丝点击