我没有看到使用相同的swf为Flex中的工作人员触发生命周期事件。我需要保持swf数据的数量很少,所以我想为两个线程使用相同的swf,因为它们使用类似的代码。没有生命周期事件,我无法初始化工作线程。我可以与worker共享数据,但是没有初始化,它实际上没用。我想避免为Worker创建一个单独的类。是否有任何在工作者中可用于初始化的事件?
import random
points1=0
points2=0
bank1=0
bank2=0
def gameloop():
global bank1
global points1
cont = "Keep going"
while cont=="Keep going":
roll1=random.randint(1,6)
roll2=random.randint(1,6)
if roll1+roll2==2:
bank1=0
points1=0
print("Unlucky! You've lost your banked and running total! Now it's the next player's turn.")
else:
points1=points1+roll1+roll2
输出:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" applicationDPI="160" preinitialize="preInitializeHandler(event)"
initialize="initializeHandler()"
creationComplete="creationCompleteHandler()"
applicationComplete="init()">
<fx:Script>
<![CDATA[
private function init():void
{ trace("Application Complete");
var swfBytes:ByteArray = this.loaderInfo.bytes;
if (Worker.current.isPrimordial) {
var bgWorker:Worker = WorkerDomain.current.createWorker(swfBytes);
bgWorker.addEventListener(Event.WORKER_STATE, workerHandler);
bgWorker.start();
}
}
private function preInitializeHandler(event:Event):void{
var p:Event=event;
trace("Pre Initialize");
}
private function initializeHandler():void{
trace("Initialize");
}
private function creationCompleteHandler():void{
trace("Creation Complete");
}
private function workerHandler(event:Event):void{
trace("Worker is running");
}
]]>
</fx:Script>
</s:Application>
答案 0 :(得分:1)
不幸的是,这种配置无法做到这一点。
配置单SWF工作者的典型示例是:
public class MadWorker extends Sprite
{
private var workerName:String = "AverageWorker";
public function MadWorker()
{
super();
init();
}
private function init()
{
var swfBytes:ByteArray = this.loaderInfo.bytes;
if (Worker.current.isPrimordial) {
this.workerName = "PrimordialWorker";
trace("Primordial worker setup");
var bgWorker:Worker = WorkerDomain.current.createWorker(swfBytes);
bgWorker.addEventListener(Event.WORKER_STATE, workerHandler);
bgWorker.start();
} else {
trace("Non-primordial worker setup");
//Start long-running calculation
}
}
private function workerHandler(event:Event):void{
trace("Worker is running: " + this.workerName);
}
}
在构造函数中调用init()
这一事实非常重要;在创建Worker时,它只是调用类的构造函数。在Actionscript中定义类时没有问题,但它在MXML中是一个showstopper(您无法为MXML组件定义构造函数 - 请参阅the documentation和docs更多关于这一点)。
不幸的是,你不能只为你的主要课程延长Application
;你刚刚得到错误#1007:在非构造函数上尝试实例化。&#34; How to make MXML Component Constructor with Arguments?有详细信息。
答案 1 :(得分:0)
也许你认为一个工人只是你班级的另一个实例,应该发动相同的事件?一个工人没有阶段,没有显示列表,它实际上只是一个线程,它永远不会生成或接收任何其他事件,而不仅仅是工人要发送和接收的事件。
创建工作人员后,您可以创建必要的消息通道和属性,以确保双向通信。工人不会做任何其他事情,我不确定你期望他们做什么或为什么做的不仅仅是那个?