您当前的位置: 首页 > 

Jave.Lin

暂无认证

  • 2浏览

    0关注

    704博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

AS3 Worker DEMO

Jave.Lin 发布时间:2015-11-14 15:55:37 ,浏览量:2

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

关注
打赏
1664331872
查看更多评论
立即登录/注册

微信扫码登录

0.0390s