2015-09-02 57 views
0

更新:显然,这是某种计时问题。在下面的代码中,我通过点击处理程序创建了工作程序,但是如果我从Main构造函数创建工作程序(如文档示例所示),commandChannel消息会传递给工作人员 - 即使在任何情况下我都在执行完全相同的事情:创建工人,听取RUNNING状态,然后通过commandChannel发送消息。但是,如果我从Main构造函数创建worker,而第一条消息只能通过,而稍后的消息(某些未定义的时间在RUNNING之后)总能通过。为什么? 如果我不能依靠WorkerState.RUNNING了解何时可以向工作人员发送消息,我如何知道工人何时准备好接收消息?工作人员在RUNNING状态后没有收到消息,但确实晚了


我基本上有确切的同样的事情documentation example,但它不工作。我的设置是:

  • 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,因此这是主要工作者消息通道的特定情况。怎么了?

此外,主SWF并未捕获来自worker的任何trace操作或运行时错误。如何调试工作人员SWF?

回答

0

This seems to be a known issue (see point 2)WorkerState.RUNNING有时在worker的构造函数实际运行之前被调度。所以在我的情况下,从click处理程序中,第一条消息是在worker的构造函数添加了侦听器来接收它之前发送的。

所以我打算用简单的解决方法:当工作人员加载时,发送一条消息到主线程,在主构造函数结尾处显示“我准备好了”。在主线程中,在发送intial命令之前,先听取它而不是RUNNING