Асинхронный вызов функции во Flex - PullRequest
15 голосов
/ 19 февраля 2009

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

Ответы [ 6 ]

19 голосов
/ 19 февраля 2009

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) Вы хотите проанализировать очень большой файл, но не хотите, чтобы приложение зависало при этом.

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

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

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

9 голосов
/ 19 февраля 2009

Самый простой ответ - использовать процедуру 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 голосов
/ 22 февраля 2009

Что вам нужно, так это концепция под названием Зеленые нити . Существует зеленая библиотека потоков , но я не использовал ее.

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

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

3 голосов
/ 19 февраля 2009

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

1 голос
/ 21 февраля 2009

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;
}

Приветствия

1 голос
/ 19 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...