Проблема состоит в том, что Flash является единственным, распараллелил, т.е. пока часть кода не работает, никакая другая обработка не может быть сделана. Необходимо будет так или иначе разбить обработку в меньшие блоки и выполнить эти блоки, скажем, на enterFrame
событие.
Править: Я боюсь, что downvoting это (или Simon) ответ не изменяет то, что это не выполнимо в AS3. Прочитайте эту статью для большего понимания на проблеме. Статья также включает простую "библиотеку" под названием PseudoThread, который помогает в выполнении долгих фоновых вычислений. Все еще необходимо разбить проблему в мелкие кусочки сами, все же.
Я могу сказать Вам окончательно что с Flex 3, нет никакой встроенной конструкции, подобной ProcessMessages
функциональность Вы описываете.
Наиболее распространенный способ работать вокруг этого состоит в том, чтобы разделить любую работу, которую Вы обрабатываете в очередь задач "рабочего" и "менеджера рабочего" для управления очередью. Поскольку каждый "рабочий" завершает его обработку, диспетчер очереди рабочего выталкивает следующего рабочего от очереди и выполняет ее в a callLater()
вызов. Это будет иметь эффект, который подобен "уступке основному потоку", и позвольте Вашему UI получить события и быть быстро реагирующим, все еще позволяя обработке продолжиться, когда управление возвращается рабочему.
После того как у Вас есть эта работа, можно сделать некоторое тестирование и профилирование, чтобы выяснить, может ли приложению сойти с рук выполнение выполнения нескольких рабочих перед вызовом callLater()
, и инкапсулируйте эту логику в рамках диспетчера очереди рабочего. Например, в нашей реализации этого шаблона (с несколькими сотнями рабочих в очереди), мы смогли сделать обработку более быстро с сопоставимой воспринятой производительностью путем казни 4 рабочих перед "уступкой основному потоку" с callLater()
, но это полностью зависит от объема и природы работы, которую делают Ваши рабочие.
Модель процесса для ActionScript является единственной, распараллелил, таким образом, ответ нет. Лучший выбор состоит в том, чтобы или подчиниться асинхронной задаче на сервере, если Вы можете, или открываться курсор ожидания, в то время как Ваш длинный цикл работает, или повредите свой процесс в некоторые мелкие кусочки, которые являются не совсем как навязчивые к UI или выполняют длительные задачи в момент, когда пользователь, менее вероятно, будет чувствовать эффект (запуск приложения, например).
Actionscript единственный поточный дизайном, никакая сумма ответов downvoting не изменит это.
Для совместимости Ваш лучший выбор состоит в том, чтобы попытаться разделить Вашу обработку на меньшие блоки и сделать Вашу обработку многократно.
При абсолютной необходимости в поточной обработке, она может отсортировать, сделаны в Flash Player 10 с помощью фильтров Pixel Bender. Они будут работать на отдельном потоке и могут дать Вам обратный вызов, после того как они сделаны.
Я полагаю, что они хорошо подходят для "хардкорных" задач обработки, таким образом, они могли бы соответствовать Вашей цели приятно. Однако они поместят целый другой набор требований к Вашему коду, таким образом, Вы могли бы быть лучше из выполнения маленьких "блоков" вычислений так или иначе.
В Flash player нет никакой эквивалентной функциональности. Дизайном Flash player чередуется между рендерингом на экран и затем выполнением всего кода для каждого кадра. Используя Event.ENTER_FRAME
события, демонстрирующиеся объекты, или Timer
объекты в другом месте, лучший выбор для разбивания очень длинных вычислений.
Стоит отметить, что некоторые события в ActionScript имеют updateAfterEvent()
функция со следующим описанием:
Сообщает Flash player, или время выполнения AIR для рендеринга после обработки этого события завершается, если дисплейный список был изменен.
В частности, TimerEvent
, MouseEvent
, и KeyboardEvent
поддержка updateAfterEvent()
. Могут быть другие, но это - те, я нашел с быстрым поиском.