In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

Worker間でのByteArrayの受け渡しテスト forked from: ActionScript Worker test

/**
 * Copyright selflash ( http://wonderfl.net/user/selflash )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/ymso
 */

// forked from bkzen's ActionScript Worker test
package {
    import flash.display.AVM1Movie;
    import flash.events.Event;
    import flash.text.TextField;
    import flash.display.Sprite;
    import flash.system.MessageChannel;
    import flash.system.Worker;
    import flash.system.WorkerDomain;
    import flash.utils.ByteArray;
    import flash.display.BitmapData;
    import flash.net.registerClassAlias;
    
    /*======================================================================*//**
     * FlashTest クラス
     */
    public class FlashTest extends Sprite {
        //デバッグ用テキストフィールド
        public var tf:TextField    
          
        //サブワーカー
        private static var _subWorker:Worker;
        
        //メッセージチャンネル
        //Main → Sub
        private static var _mainToSub:MessageChannel;
        //Sub → Main
        private static var _subToMain:MessageChannel;
           
        /*======================================================================*//**
         * コンストラクタ
         */
        public function FlashTest() {
            if (Worker.current.isPrimordial){
                //▼メインワーカー
                
                //テキスト
                tf = new TextField();
                tf.autoSize = "left";
                addChild(tf);
                                
                //サブワーカー
                _subWorker = WorkerDomain.current.createWorker(loaderInfo.bytes);
                           
                //メッセージチャンネル作成         
                //Main → Sub   
                _mainToSub = Worker.current.createMessageChannel(_subWorker);   
                _mainToSub.addEventListener(Event.CHANNEL_MESSAGE, _channelEventHandler_Main);  
                //Sub → Main    
                _subToMain = _subWorker.createMessageChannel(Worker.current);    
                _subToMain.addEventListener(Event.CHANNEL_MESSAGE, _channelEventHandler_Main);            
                
                //チャンネルを共有    
                _subWorker.setSharedProperty("mainToSub", _mainToSub);            
                _subWorker.setSharedProperty("subToMain", _subToMain);            
                
                //サブワーカー開始
                _subWorker.start();
                
                //-----------------------------------------------
                //通信開始
                tf.appendText("[メイン]もしもーし\n");
                _mainToSub.send("もしもーし");
                //-----------------------------------------------
            } else {
                //▼サブワーカー
                
                //メッセージチャンネル取得            
                //Sub → Main            
                _subToMain = Worker.current.getSharedProperty("subToMain");            
                _subToMain.addEventListener(Event.CHANNEL_MESSAGE, _channelEventHandle_Sub);    
                //Main → Sub
                _mainToSub = Worker.current.getSharedProperty("mainToSub");            
                _mainToSub.addEventListener(Event.CHANNEL_MESSAGE, _channelEventHandle_Sub);
            }
        }
                            
        //=========================================================================//
        // EVENT HANDLER
        //=========================================================================// 
            
        /*======================================================================*//**
         * メイン用
         */
        private function _channelEventHandler_Main($event:Event):void {
            switch($event.type){
                case Event.CHANNEL_MESSAGE:
                    switch($event.target) {
                        //サブワーカーから
                        case _subToMain:
                            var message:String = _subToMain.receive(true);
                            tf.appendText("[サブ]"+message+"\n");
                            
                            switch(message){
                                case "なんですかー?":                
                                    tf.appendText("[メイン]共有領域にByteArray置いてよー\n");
                                    _mainToSub.send("共有領域にByteArray置いてよー");
                                    break;
                                    
                                case "ByteArray置いたおー":
                                    //-----------------------------------------------
                                    //ByteArrayの受け取りテスト
                                    var byteArray1:ByteArray;
                                    //sharedByteArray.shareable = true;           
                                    byteArray1 = _subWorker.getSharedProperty("byteArray1") as ByteArray;
                                    
                                    tf.appendText("\n-----------------------------\n");
                                    var object1:Object = byteArray1.readObject();
                                    tf.appendText(object1.width+"\n");
                                    tf.appendText(object1.height+"\n");
                                    tf.appendText("-----------------------------\n\n");
                                    //-----------------------------------------------
                                    
                                    tf.appendText("[メイン]共有領域にBitmapData置いてよー\n");
                                    _mainToSub.send("共有領域にBitmapData置いてよー");
                                    break;
                                    
                                case "BitmapData置いたおー":
                                    //-----------------------------------------------
                                    //ByteArrayの受け取りテスト
                                    var bitmapData1:BitmapData;
                                    bitmapData1 = _subWorker.getSharedProperty("bitmapData1") as BitmapData;
                                    tf.appendText("\n-----------------------------\n");
                                    tf.appendText(String(bitmapData1)+ "\n");
                                    tf.appendText("-----------------------------\n\n");
                                    //-----------------------------------------------  
                                    
                                    tf.appendText("[メイン]BitmapDataは無理ぽ・・\n");                                    
                                    tf.appendText("[メイン]BitmapDataをByteArrayに書き込んで置いてみてー?\n");
                                    _mainToSub.send("BitmapDataをByteArrayに書き込んで置いてみてー?");
                                    break;
                                
                                case "書き込んだおー":
                                    //-----------------------------------------------
                                    //ByteArrayの受け取りテスト
                                    var byteArray2:ByteArray;
                                    //byteArray2.shareable = true;           
                                    byteArray2 = _subWorker.getSharedProperty("byteArray2") as ByteArray;
                                    
                                    tf.appendText("\n-----------------------------\n");
                                    var object2:Object = byteArray2.readObject();
                                    tf.appendText(object2+"\n");
                                    tf.appendText(object2.width+"\n");
                                    tf.appendText(object2.height+"\n");
                                    
                                    var bitmapData2:BitmapData = object2 as BitmapData;
                                    tf.appendText(bitmapData2+"\n");
                                    tf.appendText("-----------------------------\n\n");
                                    //-----------------------------------------------
                                    
                                    tf.appendText("[メイン]やっぱり無理ぽ・・\n");
                                    tf.appendText("つづく・・・\n");   
                                    break;
                                    
                                default:
                                
                                    break;
                                
                            }
                            break;
                            
                        //メインワーカーから    
                        case _mainToSub:
                            //tf.appendText("メイン → サブ\n");      
                            break;
                    }
                    break;
            }
        }
                    
        /*======================================================================*//**
         * サブ用
         */
        private function _channelEventHandle_Sub($event:Event):void {
            switch($event.type){
                case Event.CHANNEL_MESSAGE:
                    switch($event.target) {
                        //メインワーカーから
                        case _mainToSub:
                            var message:String = _mainToSub.receive(true);
                            
                            switch(message){
                                case "もしもーし":
                                    _subToMain.send("なんですかー?");
                                    break;
                                
                                case "共有領域にByteArray置いてよー":
                                    //-----------------------------------------------                    
                                    // ByteArrayオブジェクトを生成し、shareableの値をtrueにする                            
                                    var byteArray1:ByteArray = new ByteArray();                            
                                    //byteArray1.shareable = true;
                                    byteArray1.writeObject({ width:100, height:500 }); 
                                    byteArray1.position = 0;
                                    Worker.current.setSharedProperty("byteArray1", byteArray1);
                                    //-----------------------------------------------
                                    
                                    _subToMain.send("ByteArray置いたおー");
                                    break;
                                
                                case "共有領域にBitmapData置いてよー":
                                    //-----------------------------------------------
                                    var bitmapData1:BitmapData = new BitmapData(500, 100);
                                    Worker.current.setSharedProperty("bitmapData1", bitmapData1);
                                    //-----------------------------------------------
                                    
                                    _subToMain.send("BitmapData置いたおー");
                                    break;
                                    
                                case "BitmapDataをByteArrayに書き込んで置いてみてー?":
                                    _subToMain.send("やってみるお");    
                                                 
                                    //-----------------------------------------------
                                    var bitmapData2:BitmapData = new BitmapData(500, 100);
                                    var byteArray2:ByteArray = new ByteArray();                            
                                    //byteArray2.shareable = true;
                                    byteArray2.writeObject(bitmapData2); 
                                    byteArray2.position = 0;
                                    Worker.current.setSharedProperty("byteArray2", byteArray2);
                                    //-----------------------------------------------  
                                              
                                    _subToMain.send("書き込んだおー");                                                          
                                    break;
                                
                            }
                             break;
                             
                        //サブワーカーから
                        case _subToMain:
                        
                            break;
                    }
                    break;
            }
        }
    }
}