![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Apr 2008
Сообщений: 11
|
Всем привет!
Ктонибудь может подсказать по теме? Быть может интересная литература или ещё какието ресурсы. Столкнулся с тем, что во Flex зачастую не все работает так, как ты этого ожидаеш. Timer я так понял не запускается в отдельном потоке, и обработчики событий вызываются не всегда по цепочке. Очень интересно былобы узнать когда имеет место асинхронность и может быть есть пути делать какието вещи синхронно, если это нужно. |
|
|||||
|
[+1 18.03.08]
Регистрация: Nov 2006
Сообщений: 223
|
Стандартных средств для синхронного вызова методов нет.
Приходиться делать самодельные очереди. Реализовать можно по-разному. Например: массив "операция" (или функции, или специальные объекты) и индекс, какая из операций текущая. Каждая операция должна сообщить о своём завершении. При этом индекс увеличится на единицу и будет выполнена запущена следующая операция. Вариант: вместо изменения индекса просто удалять "отстрелявшуюся" операцию из очереди. ---- А вообще, как я уже неоднократно говорил ранее, надо менять компилятор, чтобы всё это было прозрачно. Последний раз редактировалось WindWalker; 08.04.2008 в 06:40. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
LexeY4eg, ActionScript сам по себе работает в единственном потоке.
|
|
|||||
|
Регистрация: Apr 2008
Сообщений: 11
|
У меня tcnm ytcrjkmrj вопросов:
1. если я в цикле вызываю какойто метод у кучи обьектов, есть ли гарантия, что каждый последующий метод будет выполнен по завершению предыдущего? По такому ли принципу, построен вызов методов у классов-listenerов внутри EventDispatcher, или там используются какието нативные для языка вещи? 2. Если ActionScript работает в одном потоке, то как реализован Timer? 3. Где можно посмотреть исходники EventDispatcher и других классов Flex SDK, хотябы Timer ещё. |
|
|||||
|
[+1 18.03.08]
Регистрация: Nov 2006
Сообщений: 223
|
Цитата:
Это не мешает коду на ActionScript быть многопоточным. Аналогии: JVM (по крайней мере некоторые из её реализаций) работают в одном потоке. Это не мешает коду на Java быть многопоточным. Одноядерный процессор без Hyper Threading может исполнять только один поток одновременно. Это не мешает приложениям быть многопоточными. Поток в любой момент можно поставить "на паузу" и начать выполнять другой поток. Квантованием времени можно достигнуть эффекта, что несколько потоков выполняются одновременно. Кроме того, один поток может быть остановлен, ожидая какого-то события. В это время может выполняться другой поток. Разумеется, есть некоторые ограничения, накладываемые всё той же однопоточностью AVM2, например, многопоточность будет невытесняющая: каждый поток сам должен время от времени останавливать себя, давая возможность выполниться другим потокам. То есть как в старом добром Windows 3.1 Цитата:
Следующий будет вызван только после того, как завершиться предыдущий. Но если эти методы запускают какие-то "долгоиграющие" действия, например: запуск анимации, проигрывание звука, запрос к серверу и т.д., то методы будут исполнятся не дожидаясь, пока эти длительные действия завершаться. Последний раз редактировалось WindWalker; 08.04.2008 в 15:54. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
WindWalker, тогда напишите компилятор, который создаст AVM2-совместимый код и реализующий эту самую многопоточность. А пока этого нет, никакой многопоточности в плеере и AS нет.
|
|
|||||
|
Регистрация: Sep 2007
Адрес: Путенбург
Сообщений: 147
|
Цитата:
![]()
__________________
<!-- КРЭКС ПЭКС ФЛЭКС --> |
|
|||||
|
[+1 18.03.08]
Регистрация: Nov 2006
Сообщений: 223
|
Да есть там всё.
Вот примерчик когда-то делал, именно как демонстрацию многопоточности. Одновременно происходят вычисления, которым требуется очень много времени и которые в обычном случае подвесили бы флеш-плеер, и появилась бы ошибка "скрипт выполняется слишком долго". Здесь же этого не происходит, вычисления выполняются постепенно и на экран выдаётся текущий прогрес. По сути - два отдельных потока: один вычисляет, другой отображает. Есть в этом что-то чудесное и удивительное? Нет. Все прекрасно знают, как это сделать, и сами делали не раз. Но это требует написание дополнительного кода, а также рестуктуризацию самого кода вычислений (простой цикл заменяется на несколько функций). Новый компилятор нужен только для того, чтобы освободить от этой рутины, чтобы каждый раз не изобретать этот велосипед. Вобщем, скажем так: AVM2 выполняется в одном потоке. Код на abc-байткоде может быть многопоточным. ActionScript3 не имеет встроенных средств для создания и работы с потоками, поэтому приходиться использовать обходные пути. |
|
|||||
|
Регистрация: Apr 2008
Сообщений: 11
|
Цитата:
public class Test
{
private var name:String;
public function Test(s:String) {
name = s;
}
public function test():void {
trace("start " + name);
for (var i:Number = 0; i < 1000000; i ++) {
for (var j:Number = 0; j < 100; j ++) {
}
}
trace("finish " + name);
}
}
for (var i:Number = 0; i < 3; i ++) {
var t:Test = new Test(i.toString());
t.test();
}
start 0 finish 0 start 1 finish 1 start 2 finish 2 как вы это обьясните? |
|
|||||
|
[+1 18.03.08]
Регистрация: Nov 2006
Сообщений: 223
|
Цитата:
Нпример, загрузка внешнего файла или HTTP-запрос. Пока цикл не закончится, функция разумеется не завершится. |
![]() |
![]() |
Часовой пояс GMT +4, время: 17:27. |
|
|
« Предыдущая тема | Следующая тема » |
|
|