![]() |
Цитата:
Цитата:
Многопоточность надо реализовывать как раз на низком уровне, иначе это будет псевдомногопоточность. Цитата:
И надо не забывать, что флешовый runtime весит около двух мегабайт, а не пятнадцати, как Java. Для веба размер runtime очень критичен, поэтому не все сразу. И что именно вы хотите обсудить? Как было было прекрасно, если… и повздыхать по этому поводу? Пути реализации runtime-транслятора на AS3? Если да, то лично я не вижу смысла в такой штуке, реализовывать на ней что-либо и потом бороться с глюками, теряя время и деньги неоправданно. |
Цитата:
|
Давайте переживать трудности по мере их поступления (с) Жванецкий
Никто не застрахован от багов и глюков. В том же флеш-плеере, флексе и адобовском компиляторе их предостаточно. Сейчас у меня, так сказать, стадия проектирования. Я как раз хочу заранее предусмотреть, с какими проблемами придётся столкнуться и либо найти путь их решения, либо всё-таки осознать, что да, действительно, вся затея обречена на провал. Но пока ни одной такой роковой проблемы озвучено не было. Да, я не профессионал в области создания компиляторов, однако некоторый опыт всё же имеется. К тому же, в данном случае не нужно писать всё с нуля - только изменить существующие. Исходники haXe доступны давно, исходники флексового компилятора тоже недавно были открыты - есть из чего выбрать. На худой конец сделать именно транслятор, на выходе у которго не байт-код, а код на AS3. Реализовать псевдомногопоточность (мне больше нравится термин интегрированная многоконвеерность) можно разными способами. Я ожидал как раз таки рассмотрения этих способов и выбора наиболее оптимального из них (по критериям безопасности, затрат ресурсов и т.д.). |
К сожалению, на тему конвееров я с вами не собеседник, у меня острой необходимости в их использовании не было.
|
__etc, у меня к вам вопрос. В посте № 28 вы привели код
Код AS1/AS2:
Код AS1/AS2:
Пройдем по шагам. Клиент (под клиентом подразумевается код, который вызывает ваш) вызывает connect() Допусти ответа нет, тогда вызывается attempt() в котором выполняется this._timeoutID = setTimeout(this.connect, 500); и всё, на этом метод connect() заканчивается? В этом случае код клиента пойдет дальше, неизвестно куда. Приведенный же выше код с синхронными вызовами работает совсем не так. Он гарантированно или подключится или нет, и всё это время клиент будет ждать. Объясните, где же тут аналог? |
Kolan, ждать будет один поток, а не весь клиент.
|
BlooDHounD, помогите разобраться. Что значит один поток? Что это за поток и откуда он берется?
И главное, что заставит его ждать? setTimeout? Ведь это просто запуск таймера. Таймер просто запуститься и ждать его никто не будет. Рассмотри пример того же WindWalker, который который он приводит в обсуждении на gotoandflash.ru: Он говорит, что аналогом кода Код AS1/AS2:
Код AS1/AS2:
Код AS1/AS2:
Это означает, что никакого ожидания нет и такой вариант (с setTimeout(test_part2, 1000)) — это совершенно не аналог delay(1000);. Совсем непонятно, почему и WindWalker и __etc говорят о их идентичности. |
Было сказано про аналогичность в рамках конкретной локальной задачи. Если говорить о реальной реализации - флексовый компилятор опенсорсен, дорабатывайте под свои нужды(например, такой доработкой были реализованы вещи типа code coverage для flex) для симуляции delay.
|
Я не хочу дорабатывать или флеймить, я хочу понять как устроен Флекс.
Даже в рамках конкретной задачи код __etc, о котором я говорил ранее в посте № 45 не решает задачу, которую просит решить WindWalker. |
Всё просто: в ActionScript нет ни sleep, ни delay, т. е. остановить поток нельзя. Но вместо остановки можно просто ничего не делать и повесить вызов нужной функции по таймеру.
|
__etc, я правда вас не понимаю. А что делать, если код устроен так, что нужно дождаться окончания чего-то? Вы понимаете, что ваши варианты с таймером не подходят, потому, что они все равно асинхронные?
Правильно ли я понимаю, что единственный прием, который сейчас используют разработчики на Флексе, чтобы создать синхронность — это посылка следующего запрос внутри обработчика получения предыдущего? Считаю, что это плохая практика, которая влечет за собой или очень сложную логику, которую также сложно модифицировать (из-за «запаха» Shotgun Surgery) или на что-то просто плюют и не делают все проверки. Сам считаю, что в такой стесненной ситуации самый правильный вариант сделать всю систему асинхронной. Это значит, что модель предметной области должна рассчитывать на то, что она может меняться в любой момент времени и должна на это корректно реагировать. Прошу, поругайте мою идею. А может есть еще какие-то приемы? |
Специфика работы в ActionScript как раз и состоит в том, что загрузка любых данных, коннекты и прочее — асинхронно (нет никакой синхронности в ActionScript, все примеры кода, приведенные здесь, являются асинхронными). А для работы с асинхронными вызовами существует событийная модель, пишутся хендлеры, подписываются на соответствующие события и все довольны. Не говоря уже об отсутствии каких-либо неудобств (на мой взгляд). Да, код получается длиннее, зато мы не заботимся о контроле над потоком, потому что он всегда выполняется.
Собственно, вам требуется изучить основные моменты при работе с ActionScript 3.0. Мой пример кода просто делает таймаут на соединение и три попытки и, собственно, всё. Т. е. я ничего не дожидаюсь. |
__etc, событийная модель мне знакома. Она есть во многих языках и хорошо уживается с синхронными вызовами. Ваш код я понял.
Неудобство асинхронности в том, что все разбросано по методам. Если, например, по логике после connect надо будет загрузить объект А, то в WindWalker со совоим кодом нипишет: Код:
connect();В итоге ветки, думаю, можно сделать такой вывод: ActionScript по сути асинхронен. Вместо того, чтобы пытаться сделать синхронные вызовы надо просто рассчитывать на это. Ваш код должен «понимать», что событие может произойти когда угодно и работать корректно в этих условиях. |
Я бы сказал, что AS в сути вообще синхронности не содержит.
|
все-таки неудобно без синхронности. приведу пример:
для валидации форм используется класс Validator, а именно метод doValidation(...):Array, который возвращает результаты проверки. а что если я хочу проверить форму на сервере? как мне быть в таком случае? как раз тут неплохо было бы сделать sleep для потока исполнения программы и подождать что вернет сервер. Так сделать нельзя, поэтому приходиться отказываться от удобного инструмента Validator :( |
Хотя прошел почти год — сегодня я написал небольшой пост про то, как мы в итоге поступили с синхронностью в КСИНО (в системе, разрабатывая которую я и задавал тут вопросы).
Суть в том, что мы сделали все асинхронным до мозга костей. В частности использовали паттерн Активная запись. Ссылка на пост. http://ksoftware.ya.ru/replies.xml?item_no=1970 |
| Часовой пояс GMT +4, время: 20:04. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.