Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Чудеса асинхронного исполнения. (http://www.flasher.ru/forum/showthread.php?t=173074)

fish_r 23.12.2011 00:11

Чудеса асинхронного исполнения.
 
Кратко опишу последовательность событий:

1. Вьюер инициализирует контролл, сохраняет на него ссылку.
2. Контролл инициализирует модель, отдает ссылку на модель во
вьюер.
3. Вьюер принимает ссылку вешает слушателя на событие готовности
данных в модели.
4. Конролл инициализирует датапровайдер отвечающий за доставку
данных.
5. Контролл сообщает модели данные извлеченные датапровайдером
из sharedobject.
6. Модель извлекает данные из полученного ByteArray и, по сути,
инициализирует объект VO.
7. Модель поручает статику подготовить два вида данных
(распарсить строку, а также подготовить html-строку для
текст.поля).
8. Модель диспатчит готовность данных для вьюера.
9. Вьюер готовит на основе полученных данных шесть, относительно
непростых виз.объектов, при инициализации последних, в них,
уже, готовятся другие виз.объекты, что требует некоторых доп.
вычислений.
10. Вьюер пытается сообщить контроллу ссылку на себя... не совсем так,
Вьюер обращается к контроллу для инициализации прослушивания его эл-тов.

В результате последнего возникает ошибка: Контролл равен null (!!!)



Как может быть такое?

PainKiller 23.12.2011 00:18

Как то слишком абстрактно без кода... Но так сходу вопросы возникают - Может где то в процессе контролл обнуляется? И что в дебаггере пошагово по контроллу видно, именно в момент возникновения ошибки?

fish_r 23.12.2011 00:30

Это было бы очень простым ответом )

Нет, проблема решается следующим образом: после шага №2 контролл устанавливает слушатель на вхождение в следующий кадр. И тогда всё нормально исполняется.
Да и трейсы показывают последовательное исполнение, не параллельное.

Значит, контролл нигде не обнуляется. В чем же может быть дело?

ЗЫ. Код и трейсы могу привести, просто его много получается, на словах проще. Если никто сходу не сможет ответить приведу и код.

ShockWave512 23.12.2011 02:53

ccылку на контрол во вьювере сделать сеттером и последить кто его менят в нул

Zebestov 23.12.2011 03:26

Цитата:

Сообщение от fish_r (Сообщение 1053183)
1. Вьюер инициализирует контролл, сохраняет на него ссылку.

Опа! Почему входной точкой является view, а не controller?

Aquahawk 23.12.2011 03:29

Цитата:

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

fish_r 23.12.2011 03:30

ссылка на контролл есть только у одного класса - у гл.класса приложения, да и тому она нафиг не нужна - почикал (код не рефакторенный) , однако это ничего не изменило, трейсы показывают последовательное исполнение:

Код:

1324592402281. DragTheWord, init,  :
1324592402296. DTW_model, loadDataCompleteHandler,  :
1324592402312. DragTheWord, addStartDataHandler,  :
1324592402328. DragTheWord, init,  :
1324592402328. DragTheWord, init,  :

Здесь числовое значение - хронометраж, строки указывают на метод в котором расположен данный трейс,
в частности строка "DragTheWord, init," указывает на метод init() класса DragTheWord().
Видно, что первая и последние две строки относятся к одному и тому же методу, первая - до инициализации контролла, последние здесь же , в этом же методе, но уже после инициализации.

Строка инициализации выглядит так:

Код AS3:

  new DTW_controll( this );

Как видно она ничего не возвращает и вернуть ничего не может, и программе незачем ждать результатов вызова, но тем не менее дальнейшее исполнение происходит только после инициализации прочих объектов...

Добавлено через 2 минуты
Цитата:

Сообщение от Zebestov (Сообщение 1053198)
Опа! Почему входной точкой является view, а не controller?

Потому, что у меня контролл - тупой кусок кабеля, правда почти, он все же готовит информацию для переваривания моделью. Значит тупой кусок кабеля с контроллером )

Zebestov 23.12.2011 03:38

Цитата:

Сообщение от fish_r (Сообщение 1053200)
Потому, что у меня контролл - тупой кусок кабеля, правда почти, он все же готовит информацию для переваривания моделью. Значит тупой кусок кабеля с контроллером )

Я было подумал, что речь об MVC.

Aquahawk 23.12.2011 03:40

собирите минимальный приме, прям интересно посмотрить

fish_r 23.12.2011 03:43

Да, речь про MVC и есть. Только так как я его понимаю. Главный класс - по сути просто фасад. Однако из за специфики флеша, он и вьюер. Оправдаться могу только тем, что они ничего и не делает, кроме старта приложения и создания подвьюх на старте.

Zebestov 23.12.2011 04:03

Цитата:

Сообщение от fish_r (Сообщение 1053205)
Да, речь про MVC и есть.

В любом MVC ни при каком раскладе и ни на каком этапе выполнения приложения входной точкой не должен становиться view, для которого все же существует controller. У меня он тоже "тонкий", но входная точка на каждом этапе приложения — именно контроллер. Именно он всех инициирует, собирает докучи и запускает в нужном порядке. Если не поздно — подумай над реорганизацией.

TanaTiX 23.12.2011 04:04

А gc его съесть не мог?

BuKT 23.12.2011 07:35

Цитата:

Во флеше нет параллельного исполнения. Когда вы диспатчите событие, прямо в этот момент и отработают все слушатели, как будто их прямо тут и вызвали. Думаю косяк у вас в этом.
Мне кажется, не совсем так. Когда диспатчится "асинхронное" событие (лоадеры, например), то оно кладётся в стек ожидания, который начинает последовательно обрабатываться слушателями на следующем enter-frame
Цитата:

Если не поздно — подумай над реорганизацией.
А разве mvc это оковы правил? Я то всю жизнь думал, что "Mein MVC" это один из способов организовать архитектуру так, как удобно мне и моим людям. [pathos mode off]

UPD: Прошу простить, если кого обидел своей крамольностью. Здесь, выше, и далее MVC as Mein MVC [+corrupted]

Aquahawk 23.12.2011 08:22

Цитата:

Когда диспатчится "асинхронное" событие (лоадеры, например), то оно кладётся в стек ожидания, который начинает последовательно обрабатываться слушателями на следующем enter-frame
Конечно, я имел в виду то что так делают только нативные события. Когда из сам диспатчишь они тут же отрабатывают.

Zebestov 23.12.2011 08:26

Цитата:

Сообщение от BuKT (Сообщение 1053213)
А разве mvc это оковы правил? Я то всю жизнь думал, что "Mein MVC" это один из способов организовать архитектуру так, как удобно мне и моим людям.

Ну и славно! Просто придумай названия для каждого "из способов организовать архитектуру так, как удобно мне и моим людям" и не применяй попусту аббревиатуру MVC. Потому что MVC — это, как известно, тоже некое множество способов, но с определенными признаками и свойствами. Одно из свойств: не "управляет" там вьюха процессами приложения.

silin 23.12.2011 14:58

Цитата:

Сообщение от fish_r (Сообщение 1053183)
1. Вьюер инициализирует контролл, сохраняет на него ссылку.
...
10. Вьюер обращается к контроллу

В результате последнего возникает ошибка: Контролл равен null (!!!)

извиняюсь, что ничего по делу, но меня заинтриговала сама постановка
ведь это чтож получается, фигня полная получается, ведь не важно же что там происходит между 1 и 10 пунктами (если конечно никто там спецом не занимается убийством контролов)
или Вьюер таки не сохраняет ссылку..
в общем, хотелось бы пощупать действующий макет явления

carrotoff 23.12.2011 15:39

А почему бы не сделать по фэн-шую? Ну, фактически, то, что предложил Zebestov.

Инициализируем контроллер, который в свою очередь создает модель и вьюху, вьюхе даем ссылку на модель либо интрфейс, который она реализует.

Aquahawk 23.12.2011 15:43

fish_r
Вы уже всех заинтересовали, иcходники в студию!

fish_r 23.12.2011 17:25

Вложений: 1
В общем, как и предполагал, к последовательному выполнению приводит обращение SharedObject.getLocal().
По прежнему, однако, остается загадкой - почему так?

В аттаче пример который, как мне кажется, более менее иллюстрирует ситуацию (для FD).

i.o. 23.12.2011 17:37

ыыы :)
Дак присвоения _shObject еще не произошло, пока отрабатывает конструктор SharedObjProvider :)

Добавлено через 3 минуты
Если init() убрать из конструктора SharedObjProvider, а код в Main модифицировать так:
Код AS3:

_shObject = new SharedObjProvider(this);
_shObject.init();

то все будет работать.
Цитата:

1324644024493.1 Main, init, :
1324644024521. Main, nextMethod, : [object SharedObjProvider]
1324644024526. SharedObjProvider, init, :
1324644024528.2 Main, init, :

fish_r 23.12.2011 17:51

Т.е. несмотря на то, что init() не возвращает значение, и поэтому программе не нужно дожидаться результатов вызова, инициализация не закончится до тех пор пока не отработают все вызовы всех методов в инициализаторах всех нижележащих классах? Да. Это несколько меняет моё представление о последовательности работы приложения.

silin 23.12.2011 17:58

Код AS3:

package
{
        import flash.display.Sprite;
 
        public class Main extends Sprite
        {
                public var test:Test
 
                public function Main():void
                {
                        test = new Test(this);
                }
        }
}
 
////
class Test
{
        public function Test(owner:Main)
        {
                trace("owner.test : " + owner.test); // owner.test : null
        }
}

ну да уже выяснили, но пусть будет как минимальный пример сабжа

i.o. 23.12.2011 18:07

Цитата:

Т.е. несмотря на то, что init() не возвращает значение, и поэтому программе не нужно дожидаться результатов вызова, инициализация не закончится до тех пор пока не отработают все вызовы всех методов в инициализаторах всех нижележащих классах?
Да.
«Чудеса синхронного исполнения» было бы уместнее в названии, кстати.

gloomyBrain 23.12.2011 18:12

А хотите еще одну интересную штуку? =) Вот смотрите:
Код AS3:

package {
 
    public class Singleton {
 
        // вот так делается статический конструктор
        // он вызывается при первом обращении к классу
        {
            trace("static constructor, class is: ", Singleton); // все ок, класс есть
        }
 
        public static const instance = new Singleton(); // null в трейсе, объект создан
 
        public function Singleton() {
 
            trace(Singleton); // трейсим именно класс, а не экземпляр, получаем null
 
        }
 
    }
 
}

То есть алгоритм такой: сначала инициализируются статические поля класса, затем уже сам класс (статический конструктор), и только после этого все остальное. Adobe style. То есть статический конструктор (который по идее должен инициализировать сам класс) в итоге может выполниться после того, как создан первый экземпляр этого класса.
И мы получаем вот такую картину: сначала создаем объект несуществующего класса, потом этот класс инициализируем в рантайме, а потом, получается назначаем этот класс нужным объектам. Ну или я не знаю как еще это можно объяснить =)

(с) Smithy

i.o. 23.12.2011 18:25

глум, там что-то другое:
Код AS3:

package
{
        public class Singleton
        {
                {
                        trace("Singleton::{} -> Singleton: " + Singleton);
                        new Singleton(Singleton);
                }
 
                public static const instance : Singleton;
 
                public function Singleton(classRef:Class=null)
                {
                        trace("Singleton::ctor() -> Singleton: " + Singleton);
                        trace("Singleton::ctor() -> classRef: " + classRef);
                }
        }
}

Цитата:

Singleton::{} -> Singleton: [class Singleton]
Singleton::ctor() -> Singleton: null
Singleton::ctor() -> classRef: [class Singleton]

expl 24.12.2011 17:25

Цитата:

Цитата:
Сообщение от fish_r Посмотреть сообщение
1. Вьюер инициализирует контролл, сохраняет на него ссылку.
Опа! Почему входной точкой является view, а не controller?
Опа! У флешеров оказывается где-то есть набор правил (кто кого должен инициализировать), выгравированных на скрижалях, которые ни в коем разе нельзя нарушать

dimarik 25.12.2011 00:26

Цитата:

Вьюер инициализирует контролл
Контролл — это какой-то специфичный вьювер, вроде button, checkbox и прочее подобное из разряда UI Controls?

fish_r 25.12.2011 02:49

Цитата:

Сообщение от dimarik (Сообщение 1053496)
Контролл — это какой-то специфичный вьювер, вроде button, checkbox и прочее подобное из разряда UI Controls?

Нет, конечно. Но, просто, пока не придумал для себя лучшего варианта инициализации триады, и этот не камильфо, согласен.


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

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