Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Асинхронный вызов функции в Flex

Автор вопроса: Abdullah JibalyОтветов: 6

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

asynchronousactionscript-3actionscriptapache-flex

Ответы

Ответ 1 · рейтинг 19 · Matt Guest

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

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

Мне немного неясен ваш конкретный вопрос, поэтому я дам два ответа:

1) Вы хотите обрабатывать файл каждые несколько секунд, чтобы реагировать на любые изменения.

В этом случае все, что вам нужно сделать, это настроить таймер для периодической проверки файла:

var fileTimer:Timer = new Timer(5000);
fileTimer.addEventListener(TimerEvent.TIMER, checkFile);

...

private function checkFile(event:TimerEvent):void {
  // read the file and do whatever you need to do.
}

2) Вы хотите проанализировать очень большой файл, но не хотите, чтобы приложение зависало при этом.

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

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

Надеюсь, это имеет смысл!

Ответ 2 · рейтинг 9 · Matt Dillard

Самый простой ответ - использовать процедуру callLater - см. Некоторую документацию здесь.

callLater( parseFile, [filename] );

...

public function parseFile( filename : String ) : void
{
    // parse the file
}

Другой подход - использовать setTimeout вызов, определенный в пакете flash.utils. Это позволяет вам вызывать подпрограмму по прошествии определенного времени. Используя эту процедуру, вы можете настроить свою parseFile функцию на многократный вызов самой себя, давая вам регулярные интервалы, которые вы искали:

parseFile( filename );

...

public function parseFile( filename : String ) : void
{
    // parse the file

    // call this function again in 5 seconds
    setTimeout( parseFile, 5000, filename );
}

Ответ 3 · рейтинг 3 · erikprice

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

Ответ 4 · рейтинг 3 · Richard Szalay

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

Реализация, которую я сделал для процесса импорта (1-5 минут), фактически отслеживала, сколько времени занимало выполнение, и допускала настраиваемое количество времени на цикл. Это позволяет вам выбрать количество отброшенных кадров (мы просто обновляли модальную полосу выполнения). Я также разделил его на подклассы с версией, которая проходила через ICollectionView с IViewCursor и запускала событие с каждым элементом.

Я не могу предоставить исходный код из-за его связи с коммерческим продуктом, но эту концепцию довольно просто реализовать.

Ответ 5 · рейтинг 1 · igkuk7

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

Ответ 6 · рейтинг 1 · Richard Haven

setTimeout и setInterval устарели.

Класс Timer допускает не только задержку, но и repeatCount: сколько раз он вызовет событие TIMER и снова начнет обратный отсчет. Предположительно, можно было бы вызвать myTimer.stop () внутри события, прежде чем делать то, что вы хотите сделать, и myTimer.start (), когда это было сделано.

private function newLinesToParse() : void
{
    myTimer = new Timer(30000, 9999);
    myTimer.addEventListener(Timer.TIMER, myTimerTick);
    myTimer.start();
}

private function myTimerTick(event : Event) : void
{
    myTimer.stop();    // or (event.currentTarget as Timer).stop();

    // do a few lines

    if (anyMoreLines)
        myTimer.start();
    else
        myTimer = null;
}

Ваше здоровье

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы