Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Передать определение класса в фоновый worker. (http://www.flasher.ru/forum/showthread.php?t=210200)

Tails 07.02.2015 07:52

Передать определение класса в фоновый worker.
 
Помогите передать определение класса в фоновый выполняющийся swf. (Worker)
Вообщем, я пробую передать ссылку на класс через канал:

Главный swf:
Код AS3:

var channel:MessageChannel;
channel.send(User); // Не экземпляр а именно класс

В фоновом приходит уже не Class а Object:
Код AS3:

trace(channel.receive()); // Object

И потом уже не могу зарегистрировать его через registerClassAlias(), так как там требуется Class.
Такая дилема.

Мотивы этой историй в том, что-бы 1 раз создать класс, который бы запускал отдельный поток с возможностью выгрузки в него реализаций (Классов) и последующей передачи выполнения разных задач с этими классами. Что-бы не делать каждый раз отдельный swf для конкретной задачи, так-как Worker принимает на вход swf.

gloomyBrain 07.02.2015 14:33

Насколько я понимаю, передать ссылку на класс, которого в воркере нет, нельзя. Просто потому что Worker - это отдельный инстанс виртуальной машины. Тем не менее, можно передать байткод, в котором класс описан.

Tails 07.02.2015 14:44

Я так думал, что передавая Class - он (определение) сериализуется и передастся в другой воркер. Но на деле, во втором воркере получаю уже Object а не Class.

Ок, как тогда записать определение класса в байткод и затем обратно собрать и зарегистрировать?
Тут вопрос получается такой: как в рантайме создать определение нового класса из байткода.
Вот простенький пример с записью класса в байткод: (Тоже самое происходит при передаче его в воркер)
Код AS3:

var bytes:ByteArray                = new ByteArray;
bytes.writeObject(User);
bytes.position        = 0;
 
trace(bytes.readObject()); // Object а не Class

Вот как обратно получить Class, что-бы можно было зарегистрировать его?

gloomyBrain 07.02.2015 16:46

Цитата:

Ок, как тогда записать определение класса в байткод и затем обратно собрать и зарегистрировать?
Тут вопрос получается такой: как в рантайме создать определение нового класса из байткода.
Вообще это 2 разных вопроса =)
По второму вопросу все просто: ApplicationDomain.getDefinition(). То есть просто берем Loader, делаем ему loadBytes(mySwfBytes) и получаем Loader с загруженной в него swf-кой. mySwfBytes - это то, что будем передавать между потоками. Там собственно и будет наш байткод.
А вот по первому вопросу все сложнее - я вижу 2 решения.
1) Разбить нужный блок приложения на кучу swf-ок (1 класс == 1 swf). Тогда сможем отсылать в воркер нужные нам классы по одному.
2) Генерить swf "на лету". Инструменты для этого есть, можно нагуглить.

ЗЫ
Не совсем ясен контекст задачи, возможно есть другие пути.

Tails 07.02.2015 20:37

Спасибо. Я решил делать отдельный swf для каждой конкретной задачи/задач.


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

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