Работник не получает сообщения после состояния RUNNING, но делает это позже

Обновление: по- видимому, это какая-то проблема времени. В приведенном ниже коде я создаю работника из обработчика щелчков, но если я создаю работника из конструктора Main (как это делает пример doc), commandChannel сообщение доходит до работника - хотя в любом случае я делаю одно и то же: создаю работника, слушаю RUNNING состояние, а затем отправить сообщение commandChannel, Но это первое сообщение проходит только тогда, когда я создаю работника из конструктора Main, а сообщения - позже (некоторые неопределенные по времени RUNNING) всегда пройти. Зачем? Если я не могу положиться на WorkerState.RUNNING знать, когда я могу отправлять сообщения работнику, как я могу узнать, когда работник готов получать сообщения?


У меня в основном то же самое, что и в примере с документацией, но он не работает. Моя настройка:

  • Flash Pro CC
  • AIR 17 для рабочего стола
  • Windows 7

Проблема в том, что работник, похоже, не получает сообщения через канал входящих сообщений, хотя он может успешно отправлять сообщения в основной SWF-канал через канал исходящих сообщений.

Это мой основной класс:

public class Main extends MovieClip {

    [Embed(source="TestWorker.swf", mimeType="application/octet-stream")]
    private var WorkerSWF:Class;
    private var workerBytes:ByteArray;

    private var worker:Worker;
    private var commandChannel:MessageChannel;
    private var resultChannel:MessageChannel;

    public function Main() {
        workerBytes = new WorkerSWF();
        stage.addEventListener(MouseEvent.CLICK, clickHandler);
    }

    private function clickHandler(e:MouseEvent):void {
        stage.removeEventListener(MouseEvent.CLICK, clickHandler);
        startWorker();
    }

    private function startWorker():void {
        trace("Start worker");

        worker = WorkerDomain.current.createWorker(workerBytes, true);

        commandChannel = Worker.current.createMessageChannel(worker);
        worker.setSharedProperty("commands", commandChannel);

        resultChannel = worker.createMessageChannel(Worker.current);
        resultChannel.addEventListener(Event.CHANNEL_MESSAGE, resultMessageHandler);
        worker.setSharedProperty("results", resultChannel);

        worker.addEventListener(Event.WORKER_STATE, workerStateHandler);
        worker.start();
    }

    private function workerStateHandler(e:Event):void {
        trace("Worker state:", worker.state);

        if(worker.state == WorkerState.RUNNING) {
            trace("Worker running");
            commandChannel.send("START PLEASE");
        }
    }

    private function resultMessageHandler(e:Event):void {
        trace(e, resultChannel.receive())
    }
}

И мой рабочий SWF класс:

public class TestWorker extends Sprite {

    private var commandChannel:MessageChannel;
    private var resultChannel:MessageChannel;

    public function TestWorker () {
        trace("isPrimordial:", Worker.current.isPrimordial)

        commandChannel = Worker.current.getSharedProperty("commands") as MessageChannel;
        commandChannel.addEventListener(Event.CHANNEL_MESSAGE, commandMessageHandler);

        resultChannel = Worker.current.getSharedProperty("results") as MessageChannel;

        resultChannel.send("Hello from worker");
    }

    private function commandMessageHandler(e:Event):void {
        trace("commandMessageHandler")

        //var message:String = commandChannel.receive();

        resultChannel.send("Whatever.");

        setInterval(respond, 1000);
    }

    private function respond(){
        resultChannel.send("Whatever " + new Date());
    }

}

Проблема в том, что работник commandMessageHandler никогда не срабатывает. Я знаю это, потому что я никогда не получаю сообщение "Безотносительно" назад к Основному SWF. Сообщение "Привет от работника" возвращается к основному SWF-файлу, поэтому оно относится к каналу сообщений от основного к работнику. В чем дело?

Кроме того, кажется, что ни trace Действия или ошибки времени выполнения от работника фиксируются основным SWF. Как отлаживать рабочий SWF?

1 ответ

Решение

Кажется, это известная проблема (см. Пункт 2). WorkerState.RUNNING иногда отправляется до того, как конструктор рабочего действительно запустится. Так что в моем случае из обработчика щелчка первое сообщение было отправлено до того, как конструктор работника добавил слушателя для его получения.

Итак, я иду с простым обходным путем: когда рабочий загружается, отправьте сообщение в основной поток, которое говорит: "Я готов" в конце конструктора. В основной теме слушайте это вместо RUNNING перед отправкой первоначальной команды.

Другие вопросы по тегам