Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Подскажите, как можно синхронно загрузить внешний файл? (http://www.flasher.ru/forum/showthread.php?t=143316)

Sociofilm 13.08.2010 08:32

Подскажите, как можно синхронно загрузить внешний файл?
 
Асинхронно - все понятно, URLLoader.load и обрабатываем COMPLETE.

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

class.Execute();
  StartParsing();
    while (...) {
      ProcessBlock();
        ProcessCommand(); // который опять же может вызвать ProcessBlock()
      ...
    }

вот как раз в ProcessCommand() мне надо подгрузить внешний файл, поставить данные в общую очередь обработки и возобновить выполнение рекурсии.

udaaff 13.08.2010 08:36

Надо дожидаться события загрузки.

Hidest 13.08.2010 12:50

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

Sociofilm 16.08.2010 12:47

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

iNils 16.08.2010 12:51

Избавьтесь от цикла.

Sociofilm 16.08.2010 14:05

Цитата:

Сообщение от iNils (Сообщение 929236)
Избавьтесь от цикла.

замечательное предложение! следующее будет "удалите программу"?:taunt:

iNils 16.08.2010 14:13

Разжевываю:
1. Синхронная загрузка невозможна.
2. Получение события возможно после выполнения действия любой функции и как следствие - требуется выход из цикла.
Вывод - надо избавится от цикла и запускать ProcessBlock после загрузки данных.

Sociofilm 16.08.2010 14:26

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

mikhailk 16.08.2010 15:33

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

Непосредственно в логике программы при асинхронном программировании циклы ничего кроме головной боли не принесут. Что мы, собственно, и наблюдаем. :)

Hidest 16.08.2010 18:18

Как раз так программа будет более прямокодна в вашей терминологии...

Sociofilm 17.08.2010 07:08

Цитата:

Сообщение от mikhailk (Сообщение 929280)
На самом деле, на мой взгляд, циклы имеет смысл использовать только для перебора чего-то там в чем-то там. Например, объектов в коллекции, элементов в массиве или свойств в объекте.

Непосредственно в логике программы при асинхронном программировании циклы ничего кроме головной боли не принесут. Что мы, собственно, и наблюдаем. :)

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

SunShadow 17.08.2010 07:54

Цитата:

Сообщение от Sociofilm (Сообщение 929408)
... Как обойтись без цикла я даже не знаю. Можно конечно на события переписать, но тогда будет значительный проигрыш в быстродействии.

по пунктам:
1) Надо перебрать все позиции
2) дожидаться события во время перебора

Как делал я:
  1. Создал объект который отвечал за один перебор, назовем его List.
  2. В List при старте определял массив со списком подлежащим к перебору.
  3. Собственно создаем цикл из трех методов:
    • Получить элемент массива. Если элемент необходимо ждать регистрируем слушатель события для следующего шага, если не надо следующий шаг пропускаем.
    • В данный шаг мы попадаем при наступлении события по окончании ожидания
    • Здесь производится проверка есть ли еще элементы в массиве List и если они имеются переходим на первый шаг списка, если нет выходим из цикла.
  4. Завершение всех процедур по работе с List
Вот и все. Теперь цикл выполняется, но при необходимости мы ожидаем наступления события. И ничего не мешает рекурсивно создавать внутри одного List другой.

Добавлено через 5 минут
Да еще как вариант. Вы можете предварительно загрузить весь список в некий кэш, а потом оттуда просто создавать копии экземпляров не дожидаясь загрузки, тогда ваш цикл будет работать в исходном виде, вот только загружать в кэш будете асинхронно перед этим, по сути получите то же самое.

wvxvw 17.08.2010 10:40

Цитата:

Сообщение от Sociofilm (Сообщение 929408)
Можно конечно на события переписать, но тогда будет значительный проигрыш в быстродействии.

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


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

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