jekeyhui99 发表于 2017-9-22 16:13:45

Flash Actionscript 多线程Worker 压缩图片

package
{
      import flash.display.Bitmap;
      import flash.display.Sprite;
      import flash.events.Event;
      import flash.external.ExternalInterface;
      import flash.geom.Rectangle;
      import flash.system.MessageChannel;
      import flash.system.Worker;
      import flash.system.WorkerDomain;
      import flash.utils.ByteArray;public class WorkerTest extends Sprite
       {
               protected var mainToWorker:MessageChannel;
               protected var workerToMain:MessageChannel;

               protected var worker:Worker;

            [ Embed(source= "1.jpg")]
               public var Image1:Class;

               public function WorkerTest()
            {
                      /**
                      * Start Main thread
                      **/
                      if(Worker.current.isPrimordial){
                            //Create worker from our own loaderInfo.bytes
                           worker = WorkerDomain.current.createWorker(this.loaderInfo.bytes);

                            //Create messaging channels for 2-way messaging
                           mainToWorker = Worker.current.createMessageChannel(worker);
                           workerToMain = worker.createMessageChannel(Worker.current);

                            var byteArray:ByteArray = Bitmap(new Image1()).bitmapData.getPixels(new Rectangle(0,0,300,300));
                           byteArray. shareable = true;      //使bytearray可以在两个线程中使用

                            //Inject messaging channels as a shared property
                           worker.setSharedProperty( "data", byteArray);

                            //Listen to the response from our worker
                           workerToMain.addEventListener(Event.CHANNEL_MESSAGE, onWorkerToMain);

                            //Start worker (re-run document class)
                           worker.start();

                     }
                      /**
                      * Start Worker thread
                      **/
                      else {

                            //Inside of our worker, we can use static methods to
                            //access the shared messgaeChannel's
                            var data:ByteArray = Worker.current.getSharedProperty( "data");
                           workerToMain = Worker.current.getSharedProperty( "workerToMain" );

                //这里可以做一些压缩的工作
                data.compress();
                           workerToMain.send(data);  //只要byteArray是shareable的,可以直接send

                     }
            }
            //Messages to the worker thread
               protected function onWorkerToMain(event:Event): void {
                      //Trace out whatever message the worker has sent us.
                      var a:* = workerToMain.receive();
                      trace(" " + a);
                     ExternalInterface.call( "alert", a);   //debug版Flashbuilder4.6运行会收不到消息,但release版或断开debug连接就没问题
            }
       }
}

jekeyhui99 发表于 2017-9-22 18:07:49

详解as3中flashplayer11.5新推出的多线程同步技术[总结]本来打算写一个多线程的图片批量处理的实例展示一下,后来觉得也没什么人需要这个多线程就算了,总之我了解的都说到了,所以这里打算总结一下就结束掉我们的教程:
[*]Worker运行在flashplayer11.4或air3.4以上,同步是flashplayer11.5和air3.5才引入的;
[*]Worker的主要目的是为了在高强度的运算下任然能保持较高运行帧率,但是Worker需要使用额外系统内存和CPU,开销很大,所以尽量少用Worker,最多同时运行时不应超过2个后台Worker(即子线程);
[*]移动平台的AIR不支持Worker!
[*]ByteArray的两个方法教程中没有说到:atomicCompareAndSwapIntAt和atomicCompareAndSwapLength,这两个方法是线程安全的,帮助文档中有讲解,但是具体用法不清楚,求大神指点!!!
[*]WorkerDomain.current.createWorker方法的第二个参数设置为true后子线程就可以对文件系统进行操作,同时子线程中的trace也可以输出了!
[*]同步技术除了可以用在共享的ByteArray上,也可以用在多个线程同时操作文件时,可以避免多个线程同时读写一个文件时导致的数据丢失或损坏的问题;
[*]共享的ByteArray对象,在一个线程中由于各种操作导致其position改变(如改变为300),在该对象传递到另一个线程后该对象的position都会被置为0;而且两个线程中的ByteArray的position改变是相互独立的,虽然是共享的ByteArray对象双方都是同一个ByteArray对象的引用,但是A线程将ByteArray的position为100,B线程的ByteArray的position还是原来的数值;
[*]共享的ByteArray对象,调用clear方法只能将position设置为0,长度不会改变,要清空共享的ByteArray对象请设置position和length为0;
[*]Condition类的wait方法可以实现线程的暂停效果,可指定暂停的时间;



页: [1]
查看完整版本: Flash Actionscript 多线程Worker 压缩图片