Использование Worker в AIR for Desktop не работает - PullRequest
0 голосов
/ 26 апреля 2020

Недавно я создал настольное приложение, которое позволяет пользователю импортировать данные Excel в SQLite. Я делаю это приложение, используя AIR for Desktop. До моего сведения дошло, что мое приложение зависнет, когда будет выполняться импорт. Поэтому я подумал, что использование Worker API в моем коде Actionscript поможет разморозить мое приложение при импорте данных. Этот вопрос связан с моим предыдущим вопросом .

Я прочитал Worker API , этот учебник и этот пример и я придумываю следующий код:

MainClass.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");
            }
        }
    }
}

WorkerClass.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")
                }
            }
        }
    }
}

Когда я запускаю код, я вижу «ADD, main 'отслеживается каждые несколько секунд, но я не вижу' start 'или' ADD, worker ', поэтому я предполагаю, что мой работник не запускается даже после того, как я запускаю его, используя bgWorker.start();. Имеет ли это какое-либо отношение к extend Sprite, поскольку все учебное пособие и пример используют его вместо extend MovieClip, как в моем MainClass.as

Я работал над этим в свое свободное время почти неделю, и я до сих пор не могу понять это. Мой партнер также пытался выяснить это со мной.

...