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 のデバッグでは、メッセージ チャネルがメッセージを正しく送信していないようです。

原因は不明ですが、ワーカーの作成時にデバッガーを接続せずにコードを実行してみてください。私がそれをすると、うまくいきます...

于 2013-05-24T20:47:47.543 に答える