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("[Worker] " + a); ExternalInterface.call( "alert", a); //debug版Flashbuilder4.6运行会收不到消息,但release版或断开debug连接就没问题 } } }