首页 > 解决方案 > 在 AIR for Desktop 中使用 Worker 不起作用

问题描述

最近我制作了一个桌面应用程序,允许用户将 Excel 数据导入 SQLite。我使用 AIR for Desktop 制作了这个应用程序。我注意到,当此导入正在进行时,我的应用程序将冻结。所以我认为在我的 Actionscript 代码中使用 Worker API 将有助于在导入数据时解冻我的应用程序。这个问题与我之前的问题有关

我阅读了Worker API、本教程和本示例,并提出了以下代码;

主类.as

package
{
    // Import related class and API

    public class MainClass extends MovieClip
    {
        [Embed(source = "WorkerThread.swf", mimeType = "application/octet-stream")]
        private static var WORKER_SWF: Class;

        private var bgWorker: Worker;
        private var mainToWorker: MessageChannel;
        private var workerToMainProgress: MessageChannel;
        private var workerToMainResult: MessageChannel;
        private var workerToMainStartup: MessageChannel;

        public function MainClass()
        {
            initialize();
        }

        private function initialize(): void
        {
            // Setup the UI
            setupStage();
            createStatusText();
            createProgressBar();

            var workerBytes: ByteArray = new WORKER_SWF() as ByteArray;

            // Create the background worker
            bgWorker = WorkerDomain.current.createWorker(workerBytes);

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

            // Receive progress from worker
            workerToMainProgress = bgWorker.createMessageChannel(Worker.current);
            workerToMainProgress.addEventListener(Event.CHANNEL_MESSAGE, onWorkerToMainProgress)
            bgWorker.setSharedProperty("workerToMainProgress", workerToMainProgress);

            // Receive result from worker
            workerToMainResult = bgWorker.createMessageChannel(Worker.current);
            workerToMainResult.addEventListener(Event.CHANNEL_MESSAGE, onWorkerToMainResult);
            bgWorker.setSharedProperty("workerToMainResult", workerToMainResult);

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

            bgWorker.start();

            setInterval(function ()
            {
                mainToWorker.send("ADD");
                trace("ADD", "main");
            }, 1000);
        }

        private function onWorkerToMainProgress(evt: Event): void
        {

        }

        private function onWorkerToMainResult(evt: Event): void
        {

        }

        private function onWorkerToMainStartup(evt: Event): void
        {
            var success: Boolean = workerToMainStartup.receive() as Boolean;

            if (!success)
            {
                //... handle worker startup failure case
            }
            else
            {
                trace("start");
            }
        }
    }
}

工人类.as

package
{
    // Import related class and API

    public class WorkerClass extends Sprite
    {
        private var mainToWorker: MessageChannel;
        private var workerToMainProgress: MessageChannel;
        private var workerToMainResult: MessageChannel;
        private var workerToMainStartup: MessageChannel;

        public function WorkerClass()
        {
            initialize();

        }

        private function initialize(): void
        {
            // Receive from main
            mainToWorker = Worker.current.getSharedProperty("mainToWorker");
            mainToWorker.addEventListener(Event.CHANNEL_MESSAGE, onMainToWorker);

            // Send to main
            workerToMainProgress = Worker.current.getSharedProperty("workerToMainProgress");
            workerToMainResult = Worker.current.getSharedProperty("workerToMainResult");
            workerToMainStartup = Worker.current.getSharedProperty("workerToMainStartup");
        }

        private function onMainToWorker(event: Event): void
        {
            if (mainToWorker.messageAvailable)
            {
                var msg: String = mainToWorker.receive() as String;

                if (msg == "ADD")
                {
                    trace("ADD", "worker")
                }
            }
        }
    }
}

当我运行代码时,我可以看到每隔几秒钟就会跟踪一次“添加,主”,但我没有看到“开始”或“添加,工人”,所以我假设我的工人即使在我启动它之后也没有运行使用bgWorker.start();. 这有什么关系,extend Sprite因为所有教程和示例都使用它而不是extend MovieClip像我的 MainClass.as

我已经在空闲时间做了将近一个星期的工作,但我仍然无法弄清楚。我的搭档也一直想和我一起解决这个问题。

标签: actionscript-3airworker

解决方案


推荐阅读