AS3 Worker DEMO

说实话,不知为何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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
demo版本所展示的部分功能: 1、创建窗口 2、设置窗口宽高,标题 3、拖拽边缘缩放窗口,拖拽窗口 4、双击顶端的标题栏,最大化和缩放 5、实现不同的窗口机制 等等……………… core核心包结构初略讲解: IWindow接口:定义所有窗口,并且Window实现了该接口 Module类:模块基类 PopModule类:弹出型环境类,继承Module PopWindow类:弹出型窗口,继承Window Window类:窗口基类 WindowEvent类:窗口事件类 WindowsManager类:窗口管理基类 core核心包实现讲解: 凡是flash cs3中继承Module的元件,都可以直接在元件的第一帧撰写代码,并且在编译的过程中会自动把代码编译出来并继承Module类,在第一帧所拽写的代码可以通过实例化后来访问,比如下面贴出的"控制台源码"就是如此写的 如果需要提供特殊环境等,可以继承Module撰写,比如PopModule,控制台的父类就是PopModule,在控制台的源码中,我们可以看得到他直接访问了window属性,得到的就是控制台所在的窗口对象 Window类实现了基本窗口操作,比如拖拽,关闭,显示等,与WindowManager是配套使用 如果需要更复杂的窗口,可以继承Window类撰写,比如PopWindow,FixedWindow类的父类就是PopWindow,在FixedWindow中,我们只需要把PopWindow的状态和模式定死在window和fixed就可以了,而PopWindow本来就是一个普通的窗口,因此创建Create窗口的时候,直接使用PopWindow即可创建一个普通的窗口,在PopWindow中,默认窗口的状态和模式都为window 核心包是另外一个公司做的。核心代码是反编译过来的。代码经过测试能正常运行。 此代码仅供学习,请勿传播。 flash版窗体系统demo观看地址:http://www.xiaos8.com/uploads/flash/window.swf

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值