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

  • 相关阅读:
    上海电信 华为HG8240R 光猫 破解
    RedSn0w 0.9.10b5 越狱iphone 4 ios 5.0.1 Cydia闪退解决
    用IIS 7.5 Express代替IIS和开发工具vs自带的ASP.NET Development Server
    远程桌面连接问题
    Enterprise Library 5.0 Hands On Lab(1):数据访问程序块(一)
    [Havok] Havok Physics物理引擎的学习入门
    [设计模式] 深入浅出单实例Singleton设计模式(Java版)
    [C#] MD5 加密的具体流程
    [轻音乐] 理查德·克莱德曼专辑[8CD]
    [SEO] [DeDe]优化SEO
  • 原文地址:https://www.cnblogs.com/huacw/p/2831130.html
Copyright © 2011-2022 走看看