zoukankan      html  css  js  c++  java
  • [心得] AS3多线程快速入门(一):Hello World[译]

    随着AIR3.4和Flash 11.4的测试版发布,Adobe终于推出了多年来被要求最多的API:多线程

    如今,使用As3 Workers 让创建真正的多线程应用变得非常简单,只需要几行代码即可。这个API相当于worker之间共享内存;还有一个新的BitmapData.copyPixelsToByteArray方法,来快速转换bitmapData到ByteArray.

    在本文中,我将全部过一遍Workers 这个API的各个组成部分。然后我们再看一个简单的小程序HelloWorker。

    一、Worker是什么?

    简单说,Worker就是你在主SWF里运行的另一个SWF程序。要创建一个Worker,你需要调用WorderDomain.current.createWorker()方法并传入一个SWF文件的字节流。共有3种方式生成那些SWF字节流。

    1.使用主SWF应用程序自身的loaderInfo.bytes属性,然后在文档类的构造函数里判断一下Worder.current.isPrimordial标志(true代表当前是主线程)。这是创建Worder最快的方式。而且在即时调用周期上也有优势。

    2.发布一个SWF文件,然后用[Embed]标签嵌入到你的主程序。这种方式在Flash Builder4.7 里将会有工具支持,但在工具还没来之前这种方式还是不太灵活。每次改变worker里的代码,你都必须重新导出一个SWF,这让人很快就厌烦了。

    3.使用Worker From Class,这个新的类库能让你直接从类创建workers。这看起来似乎是最优的解决方案,但是它让你的项目引入了一系列的外部依赖。

    在这个初始的教程中,我将集中精力在第一种方式上,使用自身的loaderInfo.bytes字节流。这是一个快速但有一定瑕疵的方式。在接下来的教程中,我将试试“Worker From Class”类库方式。

    对于第2种方式,已有一个非常好的教程,可以去看看Lee Brimelow的视频教程part 1part 2.

    让我们交流吧
    在任何多线程使用场景中通信都是关键。从一个线程直接传送内存数据到另一个线程的代价是昂贵的,而内存共享又必需细致设计和周全考虑才行。在实现Worker系统过程中,大多数的挑战都来自寻求一种正确的设计架构,能让数据在你的Worker之间彼此共享。

    为了帮我们解决这个问题,Adobe给了我们一些简单(但灵活)的方式来发送数据。

    (1)worker.setSharedProperty()和worker.getSharedProperty()

    这是传递数据最简单但是功能也最有限的方式。你可以调用worker.setSharedProperty(“key”, value)来设置数据,然后在另一边用WorkerDomain.current.getSharedProperty(“key”)来获取它们。示例代码:

    //在主线程里 
    worker.setSharedProperty("foo", true); 
       
     //在worker线程里 
    var foo:Boolean = Worker.current.getSharedProperty("foo");
    

    你在这里存储简单或者复杂对象都可以,但对于多数情况下,存储的数据都是被序列化过的,它并不是真的被共享着。如果一个数据对象在一边改变了,在另一边并不会同步更新,直到等你再次调用了set/get方法后它才会更新。
    有俩例外情况是能共享的,如果你传递的对象是ByteArray且shareable属性为true,或者是一个MessageChannel对象。巧合的是,这些正是其他两种通信方法


    (2)MessageChannel
    MessageChannels就像是一个worker到另一个的单向通行管道。它们结合使用了事件机制和简单队列系统。你在一端调用channel.send()方法,在另一端一个就会抛出一个Event.CHANNEL_MESSAGE事件。在事件的处理函数里,你可以调用channel.receive()来接收发送过来的数据。就像我提到的,这个方法类似队列。所以,你可以在两边send()或receive()多次。示例代码:

    //在主线程里 
    mainToWorker.send("ADD"); 
    mainToWorker.send(2); 
    mainToWorker.send(2); 
       
     //在worker线程里 
    function onChannelMessage(event:Event):void { 
       
         var msg:String = mainToWorker.receive(); 
        if(msg == "ADD"){ 
            var val1:int = workerToMain.receive(); 
            var val2:int = workerToMain.receive(); 
            var result:int = val1 + val2; 
             //发送计算结果给主线程 
            workerToMain(result); 
        } 
       
     }
     
    

      

    MessageChannels对象使用worker.setSharedProperty()来实现共享,所以你想在多少个worker之间共享它都是可以的。不过它们都只能有一个发送终点。这样,约定以它们的接收者来命名似乎不错。例如channelToWorker或者channelToMain。
    示例代码:

    //在主线程里 
    workerToMain = worker.createMessageChannel(Worker.current); 
    worker.setSharedProperty("workerToMain", workerToMain); 
       
     mainToWorker = Worker.current.createMessageChannel(worker); 
    worker.setSharedProperty("mainToWorker", mainToWorker); 
       
        
     //在worker线程里 
    workerToMain = Worker.current.getSharedPropert("workerToMain"); 
    mainToWorker= Worker.current.getSharedPropert("mainToWorker");
     
    

      

    对于MessageChannel和sharedProperties通信方式都有一个重要的限制,当数据发送时它们都被序列化了。这意味它们需要被解析,传输然后在另一端还原。这个的性能开销是比较大的。由于这个限制,这两种通信方式最好是应用于间隙性地传递小规模数据上。


    那如果你确实要共享一个庞大的数据块怎么办?是使用共享的ByteArray。


    (3)byteArray.shareable
    传输数据最快的方式就是根本不传输它!
    感谢Adobe给了我们可以直接共享ByteArray对象的途径。这是非常强大的,因为我们几乎可以在ByteArray里存储任何数据。要共享一个byteArray对象,你需要设置byteArray.shareable=true,然后调用messageChannel.send(byteArray)或者worker.setSharedPropert(“byteArray”, byteArray)方法来共享它。
    一旦你的byteArray对象是共享的,你可以直接对它写入数据,然后在另一端从它上面直接读取,太棒了.
    基本上这就是通信的所有方式了。正如你看到的,有3种截然不同的共享数据的方式。你可以用各种方式结合使用它们。已经过完了一遍基础结构,现在让我们来看看一个简单的Hello World的例子吧。

    【原文地址】

    AS3多线程快速入门(一):Hello World[译]
    http://bbs.9ria.com/forum.php?mod=viewthread&tid=144587&fromuid=273124

  • 相关阅读:
    轻量级数据库sqlite的使用
    Integer引发的思考
    css限制显示行数
    数据库 chapter 17 数据仓库与联机分析处理技术
    数据库 chapter 15 对象关系数据库系统
    数据库 chapter 16 XML数据库
    数据库 chapter 14 分布式数据库系统
    数据库 chapter 11 并发控制
    数据库 chapter 12 数据库管理系统
    数据库 chapter 13 数据库技术新发展
  • 原文地址:https://www.cnblogs.com/huacw/p/2831130.html
Copyright © 2011-2022 走看看