Flex单个swf worker - 没有生命周期事件或构造函数,工作者是如何配置的?

时间:2016-05-02 22:43:28

标签: actionscript-3 flex

我没有看到使用相同的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>

2 个答案:

答案 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 documentationdocs更多关于这一点)。

不幸的是,你不能只为你的主要课程延长Application;你刚刚得到错误#1007:在非构造函数上尝试实例化。&#34; How to make MXML Component Constructor with Arguments?有详细信息。

答案 1 :(得分:0)

也许你认为一个工人只是你班级的另一个实例,应该发动相同的事件?一个工人没有阶段,没有显示列表,它实际上只是一个线程,它永远不会生成或接收任何其他事件,而不仅仅是工人要发送和接收的事件。

创建工作人员后,您可以创建必要的消息通道和属性,以确保双向通信。工人不会做任何其他事情,我不确定你期望他们做什么或为什么做的不仅仅是那个?