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;
}
}
}
}