PDA

Просмотр полной версии : создать Worker из mxml ?


Troglodit
13.07.2013, 14:29
Создаю 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
Как я уже говорил, эмбедить свфку не вариант, она слишком сильно раздувает конечный файл. Много данных, с которыми надо работать из воркера. Кстати я нашел решение, костыль так сказать. Я создал свой прелоадер и все что надо инициализировать по воркеру - делаю в нем. И происходит это До вышеуказанной ошибки. Для конечного пользователя все работает как надо - и файл мал и все классы доступны. Только вот при отладке эта ошибка все равно вылазит и приходится каждый раз продолжать выполнение после нее. Это печально, но лучше чем ничего. Возможно нормальное решение все же найдется со временем.