Flex приводит к зависанию браузера при обработке большого количества данных - PullRequest
3 голосов
/ 29 июня 2011

У меня есть функция actionscript, которая должна запускать панель и затем заполнять внутри нее данные сетевой топологии.Поскольку сетевые данные слишком велики, они занимают много времени и приводят к зависанию браузера!Даже я пытался отобразить занятый курсор, который также перестал вращаться во время обработки данных.

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

Ответы [ 3 ]

3 голосов
/ 29 июня 2011

Я не совсем уверен, что вы имеете в виду под "данными топологии сети", вы могли бы дать больше информации об этом. У меня такое ощущение, что вы получаете очень большой XML-файл и пытаетесь разобрать. Это проблема, так как XML очень сложно разобрать должным образом, вы должны рассмотреть альтернативу, такую ​​как AMF, которая является двоичным форматом, который очень эффективен. Вы также должны посмотреть, как вы анализируете данные, поскольку любые функции или циклы, которые будут вызываться часто, должны быть максимально быстрыми. Кроме того, никогда просто хранит XML и связывается с этим XML; разобрать xml в вашу собственную структуру модели.

С учетом сказанного вы можете взглянуть на Green Threading , который является способом фальсификации многопоточности без полной остановки пользовательского интерфейса, поскольку Flex является однопоточным. Возможно, вы захотите опубликовать код, нарушающий ваш интерфейс. То, что вы делаете, не является невозможным, просто нужно сделать это правильно:)

2 голосов
/ 29 июня 2011

Вы можете попытаться ограничить объем обработки на кадр, скажем, 50 мс.По истечении времени сохраните состояние и вернитесь из обработчиков ENTER_FRAME.В следующем кадре, если еще есть необработанные данные, продолжите обработку.
Разделить ваши алгоритмы может быть сложной задачей, но пока многопоточность не существует во Flash, это единственный способ.
edit: некоторая иллюстрация того, что я имею в виду:
Когда вы получили данные для обработки, вызовите processData ().

private static const TIME_LIMIT_MS:int = 50;
private function processData(event:Event = null):void {
    var time:int = getTimer();
    var currentTime:int;
    do {
    ...
    currentTime = getTimer();
    while (currentTime - time < TIME_LIMIT_MS)
    if (stillHaveWork)
        addEventListener(Event.ENTER_FRAME, processData);
    else
        removeEventListener(Event.ENTER_FRAME, processData);
}

Требуется также некоторая работа, чтобы убедиться, что данные находятся в очереди, когда работа еще не завершена и поступает новая часть.

1 голос
/ 29 июня 2011

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

  1. Возьмите на сервер столько вычислений, сколько сможете.

  2. Запретите пользовательские ItemRenderers для больших сеток данных.

  3. Загрузить данные, которые фактически видны на экране, и перезагрузить, если кто-то изменит представление, как в браузере страниц

...