Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Многопоточность и асинхронный вызов методов во Flex (http://www.flasher.ru/forum/showthread.php?t=110724)

etc 11.04.2008 09:42

Цитата:

Сообщение от WindWalker
1. А откуда взялись классы в AS2? Да, реализованы они были не лучшим образом. Но тем не менее вы ими пользовались? И считали это эволюционным шагом?

Да, считал. Но это было недоклассы и проблем с ними было много. Но при этом, для писаны на AS2 были созданы прекрасные и удобные инструменты.

Цитата:

Сообщение от WindWalker
2. Мы уже убедились, что код с синхронными методами прекрасно переводиться в код на AS3 (в чём я в принципе и не сомневался). Вы лично выступали в роли транслятора. Осталось это лишь автоматизировать, поскольку обычно в роли транслятора приходиться выступать мне самому, а хочется свалить это на компилятор.

Компилятор не должен ничего транслировать, такие вещи должны быть реализованы нативно. Трансляция — полумера, если будут косяки, то контролировать их не получиться. E4X должен был быть реализован на более низком уровне, а не тучей циклов на AS3. RegExp тоже.
Многопоточность надо реализовывать как раз на низком уровне, иначе это будет псевдомногопоточность.

Цитата:

Сообщение от WindWalker
Но, видимо, выбрал не то место для серьёзных бесед. :(

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

И что именно вы хотите обсудить? Как было было прекрасно, если… и повздыхать по этому поводу? Пути реализации runtime-транслятора на AS3? Если да, то лично я не вижу смысла в такой штуке, реализовывать на ней что-либо и потом бороться с глюками, теряя время и деньги неоправданно.

FlexOkeks 11.04.2008 12:18

Цитата:

Сообщение от WindWalker
И синхронный вызов методов - самый простой, самый интуитивно понятный метод её решения. Это не отбойный молоток, это как раз таки современная немецкая ультрозвуковая безконтактная бормашина.
Но у нас такой, увы, нет, поэтому приходится по старинке пользоваться обычной бормашиной со сверлом (ивенты, таймеры) и вздыхать, что чудеса техники есть только в Германии (в Java), а мы живём в России (в Flash) и не надо путать.

Есть одна маленькая деталь, самая современная безконтактная бормашина не будет работать без электричества! Вы же предлагаете строить целую электростанцию для небольшой партии ультрасовременных машин. Решить эту проблему проще съездить в германию (сделать на java) на уровне конкретно взятого примера, а на уровне всея Руси ( флеш плеера) это занятся строительством электростанций, компиляторов, теоретически это полезно, но практически полезно иметь для начала хотябы Flash Player SDK, к чему все идет. А тема поднята слишком возвышенная для данной ветки, если про стоматологов надо задавать на стоматолог ру, то и раскрывать тему многопоточности во флэш стоило бы в подходящем разделе и с самого начала по порядку. :victory:

WindWalker 11.04.2008 13:29

Давайте переживать трудности по мере их поступления (с) Жванецкий

Никто не застрахован от багов и глюков. В том же флеш-плеере, флексе и адобовском компиляторе их предостаточно.

Сейчас у меня, так сказать, стадия проектирования. Я как раз хочу заранее предусмотреть, с какими проблемами придётся столкнуться и либо найти путь их решения, либо всё-таки осознать, что да, действительно, вся затея обречена на провал. Но пока ни одной такой роковой проблемы озвучено не было.

Да, я не профессионал в области создания компиляторов, однако некоторый опыт всё же имеется. К тому же, в данном случае не нужно писать всё с нуля - только изменить существующие. Исходники haXe доступны давно, исходники флексового компилятора тоже недавно были открыты - есть из чего выбрать.
На худой конец сделать именно транслятор, на выходе у которго не байт-код, а код на AS3.

Реализовать псевдомногопоточность (мне больше нравится термин интегрированная многоконвеерность) можно разными способами. Я ожидал как раз таки рассмотрения этих способов и выбора наиболее оптимального из них (по критериям безопасности, затрат ресурсов и т.д.).

etc 11.04.2008 14:58

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

Kolan 09.01.2009 15:30

__etc, у меня к вам вопрос. В посте № 28 вы привели код
Код AS1/AS2:


    socket.addEventListener(IOErrorEvent.IO_Error, this.handler_ioError);

private var _attempts:uint = 0;
 
private var _timeoutID:uint;
 
private function connect():void {
    this._attempts++;
    try {
        socket.connect();
    } catch (error:Error) {
        this.attempt();
    }
}
 
private function attempt():void {
    if (this._attempts > 2) {
        clearTimeout(this._timeoutID);
        // bla-bla, показываем ошибку
 
    } else this._timeoutID = setTimeout(this.connect, 500);
}
 
private function handler_ioError(event:IOErrorEvent):void {
    this.attempt();
}

Который считаете аналогом кода:
Код AS1/AS2:

var connected:bool = false;
var attempts:int=0;
while (!connected && attempts<3) {
  if (sock.connect()) {
      connected = true;       
  } else {
      attempts++;
      sleep(500);
  }
}

Какой же это аналог? Тут же нет ожидания.

Пройдем по шагам.
Клиент (под клиентом подразумевается код, который вызывает ваш) вызывает connect()

Допусти ответа нет, тогда вызывается attempt() в котором выполняется this._timeoutID = setTimeout(this.connect, 500); и всё, на этом метод connect() заканчивается? В этом случае код клиента пойдет дальше, неизвестно куда.

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

Объясните, где же тут аналог?

BlooDHounD 09.01.2009 16:12

Kolan, ждать будет один поток, а не весь клиент.

Kolan 09.01.2009 18:56

BlooDHounD, помогите разобраться. Что значит один поток? Что это за поток и откуда он берется?

И главное, что заставит его ждать? setTimeout? Ведь это просто запуск таймера. Таймер просто запуститься и ждать его никто не будет.

Рассмотри пример того же WindWalker, который который он приводит в обсуждении на gotoandflash.ru:

Он говорит, что аналогом кода
Код AS1/AS2:

function test():void {
  trace ("Before");
  delay(1000);
  trace ("After");
}

В AS будет:
Код AS1/AS2:

function test():void {
  trace ("Before");
  setTimeout(test_part2, 1000);
}
 
function test_part2():void {
  trace ("After");
}

Но ведь это же неправда. Это же никакой не налог. Я реализовал второй вариант (привожу весь модуль):
Код AS1/AS2:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
        initialize="init()">
        <mx:Script>
                <![CDATA[
 
                        private function init(): void {
                                textArea.text = textArea.text + "1";                               
                                doTest()
                                textArea.text = textArea.text + "2";
                        }               
 
                        private function doTest(): void {                               
                                  textArea.text = textArea.text + "Before";
                                  setTimeout(test_part2, 1000);
                        }
 
                        private function test_part2():void {
                                  textArea.text = textArea.text + "After";
                        }
 
                ]]>
        </mx:Script>
        <mx:TextArea x="32" y="37" width="333" height="233"
                id="textArea"/>
 
</mx:Application>

В результате в текстовое поле сначала записывается 1Before2, а потом, через секунду добавляется After. То есть строка получается такой: 1Before2After. Если бы блокировка была, то она, что логично, была бы 1BeforeAfter2.

Это означает, что никакого ожидания нет и такой вариант (с setTimeout(test_part2, 1000)) — это совершенно не аналог delay(1000);.

Совсем непонятно, почему и WindWalker и __etc говорят о их идентичности.

DarkLight 09.01.2009 19:17

Было сказано про аналогичность в рамках конкретной локальной задачи. Если говорить о реальной реализации - флексовый компилятор опенсорсен, дорабатывайте под свои нужды(например, такой доработкой были реализованы вещи типа code coverage для flex) для симуляции delay.

Kolan 09.01.2009 19:51

Я не хочу дорабатывать или флеймить, я хочу понять как устроен Флекс.

Даже в рамках конкретной задачи код __etc, о котором я говорил ранее в посте № 45 не решает задачу, которую просит решить WindWalker.

etc 09.01.2009 23:16

Всё просто: в ActionScript нет ни sleep, ни delay, т. е. остановить поток нельзя. Но вместо остановки можно просто ничего не делать и повесить вызов нужной функции по таймеру.

Kolan 10.01.2009 00:11

__etc, я правда вас не понимаю. А что делать, если код устроен так, что нужно дождаться окончания чего-то? Вы понимаете, что ваши варианты с таймером не подходят, потому, что они все равно асинхронные?

Правильно ли я понимаю, что единственный прием, который сейчас используют разработчики на Флексе, чтобы создать синхронность — это посылка следующего запрос внутри обработчика получения предыдущего?

Считаю, что это плохая практика, которая влечет за собой или очень сложную логику, которую также сложно модифицировать (из-за «запаха» Shotgun Surgery) или на что-то просто плюют и не делают все проверки.

Сам считаю, что в такой стесненной ситуации самый правильный вариант сделать всю систему асинхронной. Это значит, что модель предметной области должна рассчитывать на то, что она может меняться в любой момент времени и должна на это корректно реагировать.

Прошу, поругайте мою идею. А может есть еще какие-то приемы?

etc 10.01.2009 00:17

Специфика работы в ActionScript как раз и состоит в том, что загрузка любых данных, коннекты и прочее — асинхронно (нет никакой синхронности в ActionScript, все примеры кода, приведенные здесь, являются асинхронными). А для работы с асинхронными вызовами существует событийная модель, пишутся хендлеры, подписываются на соответствующие события и все довольны. Не говоря уже об отсутствии каких-либо неудобств (на мой взгляд). Да, код получается длиннее, зато мы не заботимся о контроле над потоком, потому что он всегда выполняется.

Собственно, вам требуется изучить основные моменты при работе с ActionScript 3.0. Мой пример кода просто делает таймаут на соединение и три попытки и, собственно, всё. Т. е. я ничего не дожидаюсь.

Kolan 10.01.2009 01:01

__etc, событийная модель мне знакома. Она есть во многих языках и хорошо уживается с синхронными вызовами. Ваш код я понял.

Неудобство асинхронности в том, что все разбросано по методам. Если, например, по логике после connect надо будет загрузить объект А, то в WindWalker со совоим кодом нипишет:
Код:

connect();
load(A);

А вам придется делать load(A); в обработчики успешного подключения, хотя подключение и загрузка вещи не особенно связанные. То есть ваш код будет обладать низким зацеплением, если тут можно использовать этот термин. Ваш код сложнее модифицировать, его нельзя окинуть взглядом, так как он находится во множестве мест... Всё это плохие запахи.

В итоге ветки, думаю, можно сделать такой вывод:
ActionScript по сути асинхронен. Вместо того, чтобы пытаться сделать синхронные вызовы надо просто рассчитывать на это. Ваш код должен «понимать», что событие может произойти когда угодно и работать корректно в этих условиях.

etc 10.01.2009 01:51

Я бы сказал, что AS в сути вообще синхронности не содержит.

Jean 06.02.2009 16:04

все-таки неудобно без синхронности. приведу пример:
для валидации форм используется класс Validator, а именно метод doValidation(...):Array, который возвращает результаты проверки. а что если я хочу проверить форму на сервере? как мне быть в таком случае?

как раз тут неплохо было бы сделать sleep для потока исполнения программы и подождать что вернет сервер. Так сделать нельзя, поэтому приходиться отказываться от удобного инструмента Validator :(

Kolan 16.09.2009 12:41

Хотя прошел почти год — сегодня я написал небольшой пост про то, как мы в итоге поступили с синхронностью в КСИНО (в системе, разрабатывая которую я и задавал тут вопросы).

Суть в том, что мы сделали все асинхронным до мозга костей. В частности использовали паттерн Активная запись.

Ссылка на пост.
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
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.