Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.04.2008, 22:23
LexeY4eg вне форума Посмотреть профиль Отправить личное сообщение для LexeY4eg Найти все сообщения от LexeY4eg
  № 1  
Ответить с цитированием
LexeY4eg

Регистрация: Apr 2008
Сообщений: 11
По умолчанию Многопоточность и асинхронный вызов методов во Flex

Всем привет!

Ктонибудь может подсказать по теме? Быть может интересная литература или ещё какието ресурсы.

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

Старый 08.04.2008, 02:20
WindWalker вне форума Посмотреть профиль Отправить личное сообщение для WindWalker Найти все сообщения от WindWalker
  № 2  
Ответить с цитированием
WindWalker
[+1 18.03.08]

Регистрация: Nov 2006
Сообщений: 223
Стандартных средств для синхронного вызова методов нет.
Приходиться делать самодельные очереди.
Реализовать можно по-разному.
Например: массив "операция" (или функции, или специальные объекты) и индекс, какая из операций текущая.
Каждая операция должна сообщить о своём завершении. При этом индекс увеличится на единицу и будет выполнена запущена следующая операция.

Вариант: вместо изменения индекса просто удалять "отстрелявшуюся" операцию из очереди.

----
А вообще, как я уже неоднократно говорил ранее, надо менять компилятор, чтобы всё это было прозрачно.


Последний раз редактировалось WindWalker; 08.04.2008 в 06:40.
Старый 08.04.2008, 10:45
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 3  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
LexeY4eg, ActionScript сам по себе работает в единственном потоке.

Старый 08.04.2008, 13:28
LexeY4eg вне форума Посмотреть профиль Отправить личное сообщение для LexeY4eg Найти все сообщения от LexeY4eg
  № 4  
Ответить с цитированием
LexeY4eg

Регистрация: Apr 2008
Сообщений: 11
У меня tcnm ytcrjkmrj вопросов:

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

Код:
for (var i:Number = 0; i < 100; i ++) {
   arrayOfSomeObjects[i].someFunctio();
}
По такому ли принципу, построен вызов методов у классов-listenerов внутри EventDispatcher, или там используются какието нативные для языка вещи?



2. Если ActionScript работает в одном потоке, то как реализован Timer?



3. Где можно посмотреть исходники EventDispatcher и других классов Flex SDK, хотябы Timer ещё.

Старый 08.04.2008, 15:37
WindWalker вне форума Посмотреть профиль Отправить личное сообщение для WindWalker Найти все сообщения от WindWalker
  № 5  
Ответить с цитированием
WindWalker
[+1 18.03.08]

Регистрация: Nov 2006
Сообщений: 223
Цитата:
Сообщение от __etc
LexeY4eg, ActionScript сам по себе работает в единственном потоке.
Не надо путать. Flash Player работает в одном потоке.
Это не мешает коду на ActionScript быть многопоточным.

Аналогии:
JVM (по крайней мере некоторые из её реализаций) работают в одном потоке. Это не мешает коду на Java быть многопоточным.

Одноядерный процессор без Hyper Threading может исполнять только один поток одновременно. Это не мешает приложениям быть многопоточными.

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

Кроме того, один поток может быть остановлен, ожидая какого-то события. В это время может выполняться другой поток.

Разумеется, есть некоторые ограничения, накладываемые всё той же однопоточностью AVM2, например, многопоточность будет невытесняющая: каждый поток сам должен время от времени останавливать себя, давая возможность выполниться другим потокам.
То есть как в старом добром Windows 3.1

Цитата:
1. если я в цикле вызываю какойто метод у кучи обьектов, есть ли гарантия, что каждый последующий метод будет выполнен по завершению предыдущего?
Да. В каждую единицу времени выполняется только один метод.
Следующий будет вызван только после того, как завершиться предыдущий.
Но если эти методы запускают какие-то "долгоиграющие" действия, например: запуск анимации, проигрывание звука, запрос к серверу и т.д., то методы будут исполнятся не дожидаясь, пока эти длительные действия завершаться.


Последний раз редактировалось WindWalker; 08.04.2008 в 15:54.
Старый 08.04.2008, 15:53
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 6  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
WindWalker, тогда напишите компилятор, который создаст AVM2-совместимый код и реализующий эту самую многопоточность. А пока этого нет, никакой многопоточности в плеере и AS нет.

Старый 08.04.2008, 16:59
FlexOkeks вне форума Посмотреть профиль Отправить личное сообщение для FlexOkeks Найти все сообщения от FlexOkeks
  № 7  
Ответить с цитированием
FlexOkeks
 
Аватар для FlexOkeks

Регистрация: Sep 2007
Адрес: Путенбург
Сообщений: 147
Цитата:
Сообщение от WindWalker
Не надо путать. Flash Player работает в одном потоке.
Это не мешает коду на ActionScript быть многопоточным.
Это что-то типа псевдомногопоточности, типа как по докумментам задания расчитаны на 10 сотрудников и зарплата на 10 человек выделяется а работает на самом деле один за десятерых, которому иногда помогают знакомые, ну там на сервер с запросом сбегать или анимацию прокрутить
__________________
<!-- КРЭКС ПЭКС ФЛЭКС -->

Старый 08.04.2008, 17:07
WindWalker вне форума Посмотреть профиль Отправить личное сообщение для WindWalker Найти все сообщения от WindWalker
  № 8  
Ответить с цитированием
WindWalker
[+1 18.03.08]

Регистрация: Nov 2006
Сообщений: 223
Да есть там всё.
Вот примерчик когда-то делал, именно как демонстрацию многопоточности.

Одновременно происходят вычисления, которым требуется очень много времени и которые в обычном случае подвесили бы флеш-плеер, и появилась бы ошибка "скрипт выполняется слишком долго".

Здесь же этого не происходит, вычисления выполняются постепенно и на экран выдаётся текущий прогрес.
По сути - два отдельных потока: один вычисляет, другой отображает.

Есть в этом что-то чудесное и удивительное? Нет. Все прекрасно знают, как это сделать, и сами делали не раз.

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

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

Вобщем, скажем так:
AVM2 выполняется в одном потоке.
Код на abc-байткоде может быть многопоточным.
ActionScript3 не имеет встроенных средств для создания и работы с потоками, поэтому приходиться использовать обходные пути.
Вложения
Тип файла: zip salesman.zip (14.6 Кб, 591 просмотров)

Старый 08.04.2008, 17:08
LexeY4eg вне форума Посмотреть профиль Отправить личное сообщение для LexeY4eg Найти все сообщения от LexeY4eg
  № 9  
Ответить с цитированием
LexeY4eg

Регистрация: 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

как вы это обьясните?

Старый 08.04.2008, 17:13
WindWalker вне форума Посмотреть профиль Отправить личное сообщение для WindWalker Найти все сообщения от WindWalker
  № 10  
Ответить с цитированием
WindWalker
[+1 18.03.08]

Регистрация: Nov 2006
Сообщений: 223
Цитата:
как вы это обьясните?
Под "долгоиграющим" действием я подразумевал не большой-пребольшой цикл, а что-то, что может быть закончено только в следующем кадре или через несколько кадров.
Нпример, загрузка внешнего файла или HTTP-запрос.

Пока цикл не закончится, функция разумеется не завершится.

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:46.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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