工作人员在RUNNING状态后没有收到消息,但确实晚了
更新:显然,这是某种计时问题。在下面的代码中,我通过点击处理程序创建了工作程序,但是如果我从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?
This seems to be a known issue (see point 2)。 WorkerState.RUNNING
有时在worker的构造函数实际运行之前被调度。所以在我的情况下,从click处理程序中,第一条消息是在worker的构造函数添加了侦听器来接收它之前发送的。
所以我打算用简单的解决方法:当工作人员加载时,发送一条消息到主线程,在主构造函数结尾处显示“我准备好了”。在主线程中,在发送intial命令之前,先听取它而不是RUNNING
。