Flex addEventListener — как обновить экран во время вызванного события?

Кажется, я не могу найти ответ на то, что я считал распространенной проблемой.

Что я хочу сделать, так это: 1. Показать диалоговое окно «Открыть файл» 2. Обработать выбранный файл 3. Во время обработки файла сообщить о ходе выполнения пользователю

У меня есть определенный файл, и я использую browserForOpen и AddEventListener:

public var fileInput:File = new File();
fileInput.browseForOpen("Open file",[filter]); 
fileInput.addEventListener(Event.SELECT, onFileSelect);

// Step 2 - function gets called to process the file
private function onFileSelect(e:Event):void
{
    // Step 3 - do some processing, and at intervals report progress to the screen
}

Моя проблема в том, что любые изменения на экране в прослушивателе событий не выполняются до тех пор, пока функция не будет завершена.

Любая помощь будет оценена по достоинству, спасибо


person Neal Hudson    schedule 12.09.2011    source источник
comment
Может у вас обработка идет быстро? Экран Flex будет перерисовываться только в зависимости от частоты кадров, и я полагаю, что по умолчанию установлено значение 24 кадра в секунду. Итак, если обработка вашего файла занимает менее 1/24 секунды; именно поэтому обработка выполняется до отображения ваших визуальных обновлений. В противном случае вы должны поделиться некоторым кодом прослушивателя событий, который обновляет экран и обрабатывает файл.   -  person JeffryHouser    schedule 13.09.2011
comment
Нет, обработка занимает минуту, спасибо   -  person Neal Hudson    schedule 13.09.2011
comment
Затем вам следует подумать о том, чтобы поделиться некоторым кодом с подробностями о том, как вы обновляете экран; так как скорее всего проблема именно в этом. Вы также можете поделиться частью кода обработки.   -  person JeffryHouser    schedule 13.09.2011


Ответы (2)


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

[чтобы быть ясным, я говорю, что вызовите отдельную функцию из таймера.]

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

person Craig Mc    schedule 13.09.2011

На шаге 3, если вы выполняете какую-то работу с интенсивным использованием процессора (например, большой анализ xml), вы можете столкнуться с этой проблемой НЕ обновления. Поскольку Flex является однопоточным, вам лучше использовать зеленую концепцию многопоточности.

Вы можете прочитать о Green Threading здесь.

person M.D.    schedule 13.09.2011