Гибкий эквивалент ProcessMessages и неотзывчивый пользовательский интерфейс во время длинных циклов

echo "<label> AAAAA";
11
задан 4 revs 19 February 2009 в 07:14
поделиться

5 ответов

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

Править: Я боюсь, что downvoting это (или Simon) ответ не изменяет то, что это не выполнимо в AS3. Прочитайте эту статью для большего понимания на проблеме. Статья также включает простую "библиотеку" под названием PseudoThread, который помогает в выполнении долгих фоновых вычислений. Все еще необходимо разбить проблему в мелкие кусочки сами, все же.

6
ответ дан 3 December 2019 в 08:05
поделиться

Я могу сказать Вам окончательно что с Flex 3, нет никакой встроенной конструкции, подобной ProcessMessages функциональность Вы описываете.

Наиболее распространенный способ работать вокруг этого состоит в том, чтобы разделить любую работу, которую Вы обрабатываете в очередь задач "рабочего" и "менеджера рабочего" для управления очередью. Поскольку каждый "рабочий" завершает его обработку, диспетчер очереди рабочего выталкивает следующего рабочего от очереди и выполняет ее в a callLater() вызов. Это будет иметь эффект, который подобен "уступке основному потоку", и позвольте Вашему UI получить события и быть быстро реагирующим, все еще позволяя обработке продолжиться, когда управление возвращается рабочему.

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

4
ответ дан 3 December 2019 в 08:05
поделиться

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

2
ответ дан 3 December 2019 в 08:05
поделиться

Actionscript единственный поточный дизайном, никакая сумма ответов downvoting не изменит это.

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

При абсолютной необходимости в поточной обработке, она может отсортировать, сделаны в Flash Player 10 с помощью фильтров Pixel Bender. Они будут работать на отдельном потоке и могут дать Вам обратный вызов, после того как они сделаны.
Я полагаю, что они хорошо подходят для "хардкорных" задач обработки, таким образом, они могли бы соответствовать Вашей цели приятно. Однако они поместят целый другой набор требований к Вашему коду, таким образом, Вы могли бы быть лучше из выполнения маленьких "блоков" вычислений так или иначе.

2
ответ дан 3 December 2019 в 08:05
поделиться

В Flash player нет никакой эквивалентной функциональности. Дизайном Flash player чередуется между рендерингом на экран и затем выполнением всего кода для каждого кадра. Используя Event.ENTER_FRAME события, демонстрирующиеся объекты, или Timer объекты в другом месте, лучший выбор для разбивания очень длинных вычислений.

Стоит отметить, что некоторые события в ActionScript имеют updateAfterEvent() функция со следующим описанием:

Сообщает Flash player, или время выполнения AIR для рендеринга после обработки этого события завершается, если дисплейный список был изменен.

В частности, TimerEvent, MouseEvent, и KeyboardEvent поддержка updateAfterEvent(). Могут быть другие, но это - те, я нашел с быстрым поиском.

1
ответ дан 3 December 2019 в 08:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: