Search code examples
actionscript-3flashworker

Flash workers - sample application not working


I'm trying to get the hang of the AS3 workers, but there must be some elusive bit of understanding that just escapes me.

I've build a fairly simple PoC to see how it should work, but with no luck. When I run the "master" SWF, it seems to load the worker SWF fine and goes through everything without a hitch, except there's no response from the bloody worker.

I'm using Flash Builder 4.6 with FlexSDK 4.9.1, the PoC projects are built as ActionScript projects.

The worker file:

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.system.MessageChannel;
    import flash.system.Worker;

    public class WorkerPOC extends Sprite
    {

        private var wToM:MessageChannel;
        private var mToW:MessageChannel;

        public function WorkerPOC()
        {
            wToM = Worker.current.getSharedProperty("wToM") as MessageChannel;
            mToW = Worker.current.getSharedProperty("mToW") as MessageChannel;
            trace(mToW.receive());
            wToM.send("Ready");
        }
    }
}

The master file:

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.net.URLLoaderDataFormat;
    import flash.net.URLRequest;
    import flash.system.MessageChannel;
    import flash.system.Worker;
    import flash.system.WorkerDomain;
    import flash.utils.ByteArray;

    public class WorkerMaster extends Sprite
    {

        private var workerLoader:URLLoader;
        private var workerData:ByteArray;

        private var worker:Worker;

        private var wToM:MessageChannel;
        private var mToW:MessageChannel;

        public function WorkerMaster()
        {
            workerLoader = new URLLoader();
            workerLoader.dataFormat = URLLoaderDataFormat.BINARY;
            addEventListener(Event.ADDED_TO_STAGE, onAdded);
        }

        private function onAdded(event:Event):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, onAdded);
            workerLoader.addEventListener(Event.COMPLETE, onHasWorker);
            workerLoader.load(new URLRequest("workers/WorkerPOC.swf"));
        }

        private function onHasWorker(event:Event):void
        {
            workerData = workerLoader.data as ByteArray;
            workerData.shareable = true;
            worker = WorkerDomain.current.createWorker(workerData);
            wToM = worker.createMessageChannel(Worker.current);
            wToM.addEventListener(Event.CHANNEL_MESSAGE, onMessage);
            wToM.addEventListener(Event.CHANNEL_STATE, onState);
            mToW = Worker.current.createMessageChannel(worker);
            worker.setSharedProperty("wToM",wToM);
            worker.setSharedProperty("mToW",mToW);
            worker.start();
            mToW.send(123);
        }

        private function onState(event:Event):void
        {
            trace("Channel state: ", wToM.state);
        }

        private function onMessage(event:Event):void
        {
            trace(wToM.receive());
        }

    }
}

Solution

  • I've been working with workers as well. I had them working for a while then everything kinda just stopped, in the same way yours is not working.

    Looks like the messagechannel is not sending the messages properly in debug in 11.7.

    Not sure why it is happening, but try running your code without the debugger attached when the worker is created. When I do that it works fine...