【问题标题】:AS3 Worker not functioning properly in Flash CC debug or release, except when publishedAS3 Worker 在 Flash CC 调试或发布中无法正常运行,除非已发布
【发布时间】:2015-10-12 01:50:04
【问题描述】:

今天我尝试用 AS3 Worker 类做一些后台工作。

但是,当我在 Windows 7 上的 Flash CC 中开发我的 AIR 桌面应用程序时,我遇到了奇怪的行为。考虑这个简单的文件作为主“线程”:

////////////////
// MainThread.as
////////////////
package{
    import flash.display.*;
    import flash.system.*;
    import flash.events.*;
    import flash.utils.*;
    public class MainThread extends MovieClip
    {
        [Embed(source="WorkerThread.swf", mimeType="application/octet-stream")]
        private static var WORKER_SWF:Class;

        var mainToWorker:MessageChannel;
        var workerToMain:MessageChannel;
        var workerToMainStartup:MessageChannel;

        public function MainThread()
        {
            var workerBytes:ByteArray = new WORKER_SWF() as ByteArray;
            var worker:Worker = WorkerDomain.current.createWorker(workerBytes, true);

            // Send to worker
            mainToWorker = Worker.current.createMessageChannel(worker);
            worker.setSharedProperty("mainToWorker", mainToWorker);

            // Receive from worker
            workerToMain = worker.createMessageChannel(Worker.current);
            workerToMain.addEventListener(Event.CHANNEL_MESSAGE, onWorkerToMain);
            worker.setSharedProperty("workerToMain", workerToMain);

            // Receive startup message from worker
            workerToMainStartup = worker.createMessageChannel(Worker.current);
            workerToMainStartup.addEventListener(Event.CHANNEL_MESSAGE, onWorkerToMainStartup);
            worker.setSharedProperty("workerToMainStartup", workerToMainStartup);

            worker.start();

            trace("hi");
        }

        private function onWorkerToMain(ev:Event): void
        {
        }

        private function onWorkerToMainStartup(ev:Event): void
        {
            var success:Boolean = workerToMainStartup.receive() as Boolean;
            trace(success);
            if (!success)
            {
                // ... handle worker startup failure case
            }
        }
    }
}

然后是worker的这个文件(这个文件的swf是内置在FlashDevelop中的):

//////////////////
// WorkerThread.as
//////////////////
package{
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.system.*;
    import flash.events.*;
    import flash.filesystem.*;

    public class WorkerThread extends MovieClip
    {
        public var mainToWorker:MessageChannel;
        public var workerToMain:MessageChannel;
        public var workerToMainStartup:MessageChannel;

        public function WorkerThread()
        {
            // Receive from main
            mainToWorker = Worker.current.getSharedProperty("mainToWorker");
            mainToWorker.addEventListener(Event.CHANNEL_MESSAGE, onMainToWorker);

            // Send to main
            workerToMain = Worker.current.getSharedProperty("workerToMain");

            // Send startup message to main
            workerToMainStartup = Worker.current.getSharedProperty("workerToMainStartup");
            workerToMainStartup.send(true);

            trace("Hello from worker world.");
            var file:File = File.desktopDirectory.resolvePath("MyTextFile.txt");
            var stream:FileStream = new FileStream();
            stream.open(file, FileMode.WRITE);
            stream.writeUTFBytes("ZA WARUDO.");
            stream.close();
        }

        private function onMainToWorker(event:Event): void
        {
        }
    }
}

以下是我在从 Flash CC 构建和启动应用程序时遇到的问题:

  • 在 Flash CC 调试器中看不到来自工作环境的跟踪。
  • onWorkerToMainStartup 侦听器从未被触发,尽管工作程序正在运行(在短暂延迟后跟踪 worker.state 将确认这一点)。
  • 工人应该写一个文件,但从来没有发生过。

不过……

  • 一旦我在 Flash CC 中停止调试器,worker 将写入文件。
  • 在发布应用并从 Windows 资源管理器执行后,它可以正常运行(意思是,文件在后台写入,而应用按预期运行)。

这太疯狂了。为什么会这样?

谢谢。

【问题讨论】:

    标签: actionscript-3 flash air flashdevelop flash-cc


    【解决方案1】:

    不久前我也遇到过类似的问题。

    我从未设法将跟踪输出通过管道传输到调试器。但是,我能够在此处的日志 txt 文件中找到工作人员跟踪输出: %APPDATA%\Macromedia\Flash Player\Logs\

    至于工作程序 SWF 在调试期间没有推进 - 尝试将工作程序 SWFS 编译为 Release,而不是 Debug。

    【讨论】:

      猜你喜欢
      • 2010-10-16
      • 2014-07-11
      • 2021-08-23
      • 2013-08-11
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多