![]() |
Многопоточность и асинхронный вызов методов во Flex
Всем привет!
Ктонибудь может подсказать по теме? Быть может интересная литература или ещё какието ресурсы. Столкнулся с тем, что во Flex зачастую не все работает так, как ты этого ожидаеш. Timer я так понял не запускается в отдельном потоке, и обработчики событий вызываются не всегда по цепочке. Очень интересно былобы узнать когда имеет место асинхронность и может быть есть пути делать какието вещи синхронно, если это нужно. |
Стандартных средств для синхронного вызова методов нет.
Приходиться делать самодельные очереди. Реализовать можно по-разному. Например: массив "операция" (или функции, или специальные объекты) и индекс, какая из операций текущая. Каждая операция должна сообщить о своём завершении. При этом индекс увеличится на единицу и будет выполнена запущена следующая операция. Вариант: вместо изменения индекса просто удалять "отстрелявшуюся" операцию из очереди. ---- А вообще, как я уже неоднократно говорил ранее, надо менять компилятор, чтобы всё это было прозрачно. |
LexeY4eg, ActionScript сам по себе работает в единственном потоке.
|
У меня tcnm ytcrjkmrj вопросов:
1. если я в цикле вызываю какойто метод у кучи обьектов, есть ли гарантия, что каждый последующий метод будет выполнен по завершению предыдущего? Код:
for (var i:Number = 0; i < 100; i ++) {2. Если ActionScript работает в одном потоке, то как реализован Timer? 3. Где можно посмотреть исходники EventDispatcher и других классов Flex SDK, хотябы Timer ещё. |
Цитата:
Это не мешает коду на ActionScript быть многопоточным. Аналогии: JVM (по крайней мере некоторые из её реализаций) работают в одном потоке. Это не мешает коду на Java быть многопоточным. Одноядерный процессор без Hyper Threading может исполнять только один поток одновременно. Это не мешает приложениям быть многопоточными. Поток в любой момент можно поставить "на паузу" и начать выполнять другой поток. Квантованием времени можно достигнуть эффекта, что несколько потоков выполняются одновременно. Кроме того, один поток может быть остановлен, ожидая какого-то события. В это время может выполняться другой поток. Разумеется, есть некоторые ограничения, накладываемые всё той же однопоточностью AVM2, например, многопоточность будет невытесняющая: каждый поток сам должен время от времени останавливать себя, давая возможность выполниться другим потокам. То есть как в старом добром Windows 3.1 Цитата:
Следующий будет вызван только после того, как завершиться предыдущий. Но если эти методы запускают какие-то "долгоиграющие" действия, например: запуск анимации, проигрывание звука, запрос к серверу и т.д., то методы будут исполнятся не дожидаясь, пока эти длительные действия завершаться. |
WindWalker, тогда напишите компилятор, который создаст AVM2-совместимый код и реализующий эту самую многопоточность. А пока этого нет, никакой многопоточности в плеере и AS нет.
|
Цитата:
|
Вложений: 1
Да есть там всё.
Вот примерчик когда-то делал, именно как демонстрацию многопоточности. Одновременно происходят вычисления, которым требуется очень много времени и которые в обычном случае подвесили бы флеш-плеер, и появилась бы ошибка "скрипт выполняется слишком долго". Здесь же этого не происходит, вычисления выполняются постепенно и на экран выдаётся текущий прогрес. По сути - два отдельных потока: один вычисляет, другой отображает. Есть в этом что-то чудесное и удивительное? Нет. Все прекрасно знают, как это сделать, и сами делали не раз. Но это требует написание дополнительного кода, а также рестуктуризацию самого кода вычислений (простой цикл заменяется на несколько функций). Новый компилятор нужен только для того, чтобы освободить от этой рутины, чтобы каждый раз не изобретать этот велосипед. Вобщем, скажем так: AVM2 выполняется в одном потоке. Код на abc-байткоде может быть многопоточным. ActionScript3 не имеет встроенных средств для создания и работы с потоками, поэтому приходиться использовать обходные пути. |
Цитата:
Код:
public class Teststart 0 finish 0 start 1 finish 1 start 2 finish 2 как вы это обьясните? |
Цитата:
Нпример, загрузка внешнего файла или HTTP-запрос. Пока цикл не закончится, функция разумеется не завершится. |
| Часовой пояс GMT +4, время: 14:56. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.