Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   создать Worker из mxml ? (http://www.flasher.ru/forum/showthread.php?t=202400)

Troglodit 13.07.2013 14:29

создать Worker из mxml ?
 
Создаю Worker из loaderInfo.bytes flex проекта:
worker = WorkerDomain.current.createWorker(_main.stage.loaderInfo.bytes);

после загрузки его получаю:

Код:

Error: Error #3731: This feature is not available within this context.
        at mx.core::Application/initContextMenu()[E:\dev\4.y\frameworks\projects\mx\src\mx\core\Application.as:1419]
        at mx.core::Application/initialize()[E:\dev\4.y\frameworks\projects\mx\src\mx\core\Application.as:1060]
        at TimeOfHeroes/initialize()
        at mx.managers.systemClasses::ChildManager/childAdded()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\systemClasses\ChildManager.as:189]
        at mx.managers.systemClasses::ChildManager/initializeTopLevelWindow()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\systemClasses\ChildManager.as:359]
        at mx.managers::SystemManager/initializeTopLevelWindow()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\SystemManager.as:3057]
        at mx.managers::SystemManager/http://www.adobe.com/2006/flex/mx/internal::kickOff()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\SystemManager.as:2843]
        at mx.managers::SystemManager/http://www.adobe.com/2006/flex/mx/internal::preloader_completeHandler()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\SystemManager.as:2723]
        at flash.events::EventDispatcher/dispatchEventFunction()
        at flash.events::EventDispatcher/dispatchEvent()
        at mx.preloaders::Preloader/timerHandler()[E:\dev\4.y\frameworks\projects\framework\src\mx\preloaders\Preloader.as:542]
        at flash.utils::Timer/_timerDispatch()
        at flash.utils::Timer/tick()

в этой строке (Application.as:1419) в сорсах Адоби находится вот что:
var defaultMenu:ContextMenu = new ContextMenu();

причина ошибки понятна, но как можно ее убрать?

примечание - не могу использовать эмбеднутую swf из-за слишком большого ее размера и не могу использовать генерацию swf из класса из-за слишком большого времени генерации.

alatar 14.07.2013 10:46

Чем вам, в данном случае, должен помочь worker?

Troglodit 14.07.2013 15:22

разгрузить основной поток от сложных вычислений, загрузки тяжелых данных с сервера, их парсинга. Мне вовсе не нужен собственно mxml в worker-е, если Вы об этом, но мне важно чтобы worker имел доступ к большому количеству классов VO (и не только), именно поэтому мне приходится впихивать в worker основной swf.

Troglodit 14.07.2013 17:36

никто не говорил о визуальных элементах в worker-e. Спасибо за совет, но в данном случае нужен именно worker.

Так проблему кто-то знает как решить? это один из трех "законных" (описанных в доках Адоби) способов формирования worker-a - использовать для него основную свфку. А вот если эта swf флексовая то Вы получите ошибку, описанную выше. Неужели такая редкая ситуация и никто не знает?

Troglodit 14.07.2013 20:16

Да почему же, смотрите:
1. Ошибка возникает когда флеш загрузив флексовую свфку инициализирует флексовый Application и в нем создает дефолтное контекстное меню, тут никакой тайны нет. Вопрос как избежать этого действия.
2. байты и с мейна и со стейджа одни и те же.

Спасибо за ссылки, но они давно прочитаны и они ни слова не говорят о моей проблеме (worker из mxml). И в видео он создает as3 проект а вовсе не флексовый. Воркеры я создавать умею, они успешно работают. Но с mxml вот такая трудность.

Попробуйте создать самый базовый флекс проект, и из него загрузить самого себя как воркер и не получить ошибку:

Код:

<?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"
                          minWidth="955"
                          minHeight="600"
                          initialize="onInit();">
        <fx:Script>
                <![CDATA[
                        import flash.system.Worker;
                        import flash.system.WorkerDomain;
                       
                        private function onInit():void
                        {
                                addEventListener(Event.ADDED_TO_STAGE,onAdded);                               
                        }
                       
                        protected function onAdded(event:Event):void
                        {
                                removeEventListener(Event.ADDED_TO_STAGE,onAdded);
                                var d:WorkerDomain=WorkerDomain.current;
                                var worker:Worker = d.createWorker(loaderInfo.bytes);
                                worker.start();                               
                        }                               
                ]]>
        </fx:Script>
        <s:Button>
        </s:Button>
</s:Application>


alatar 16.07.2013 00:16

Ну так и выносите в worker загрузку и парсинг.Незачем тащить туда Application, он для этого не предназначен.

Troglodit 16.07.2013 02:33

Как я уже говорил, эмбедить свфку не вариант, она слишком сильно раздувает конечный файл. Много данных, с которыми надо работать из воркера. Кстати я нашел решение, костыль так сказать. Я создал свой прелоадер и все что надо инициализировать по воркеру - делаю в нем. И происходит это До вышеуказанной ошибки. Для конечного пользователя все работает как надо - и файл мал и все классы доступны. Только вот при отладке эта ошибка все равно вылазит и приходится каждый раз продолжать выполнение после нее. Это печально, но лучше чем ничего. Возможно нормальное решение все же найдется со временем.


Часовой пояс GMT +4, время: 17:46.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.