0

我正在尝试了解 AS3 工作人员的窍门,但一定有一些难以捉摸的理解让我无法理解。

我已经构建了一个相当简单的 PoC 来看看它应该如何工作,但没有运气。当我运行“主” SWF 时,它似乎可以很好地加载工作程序 SWF 并且顺利完成所有操作,除了该死的工作程序没有任何响应。

我将 Flash Builder 4.6 与 FlexSDK 4.9.1 一起使用,PoC 项目构建为 ActionScript 项目。

工人档案:

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

主文件:

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

    }
}
4

2 回答 2

1

我也一直在与工人一起工作。我让他们工作了一段时间,然后一切都停止了,就像你的工作不工作一样。

看起来消息通道在 11.7 的调试中没有正确发送消息。

不知道为什么会发生这种情况,但请尝试在创建 worker 时不附加调试器的情况下运行您的代码。当我这样做时,它工作正常......

于 2013-05-24T20:47:47.543 回答
1

听起来很奇怪,但你申请了吗

-swf-verion=XXX    // XXX must be > 17

作为编译器参数?我问这个,因为我有一个非常相似的问题:) Apache Flex 4.7 中的工人

于 2013-05-11T05:23:59.710 回答