(у меня была такая же проблема =>, даже если эта ветка старая, я просто хотел предложить свое решение)
(отказ от ответственности: это немного уродливо, но говорят, что это нормально на уровне пользовательского интерфейса ... ;-))
Flex является однопоточным (по крайней мере, с точки зрения нашего разработчика, я думаю, что за кулисами потоки используются виртуальной машиной)
=> Вы обычно выполняете свой код в потоке пользовательского интерфейса после того, как пользователь выполнил какое-то действие с виджетом. Любой вызов для обновления компонента пользовательского интерфейса (например, setProgress или setLabel) будет отображаться только на экране в конце цикла рендеринга (см. Снова жизненный цикл UiComponent).
=> В терминологии вызов "cpuIntensiveCalc" в callLater позволит инфраструктуре отобразить ваше всплывающее окно перед выполнением метода.
На практике, однако, я заметил, что для отображения всплывающего окна обычно требуется несколько циклов пользовательского интерфейса, например:
new MuchLaterRunner(popup, 7, cpuIntensiveCalc).runLater();
MuchLaterRunner определяется следующим образом:
public class MuchLaterRunner
{
var uiComp:UIComponent;
var currentCounter = 0;
var cyclesToWaitBeforeExecution=0;
var command:Function;
public function MuchLaterRunner(uiComp:UIComponent, cyclesToWaitBeforeExecution:uint, command:Function)
{
this.uiComp = uiComp;
this.command = command;
this.cyclesToWaitBeforeExecution =cyclesToWaitBeforeExecution;
}
public function runLater() {
currentCounter ++;
if (currentCounter >= cyclesToWaitBeforeExecution) {
uiComp.callLater(command);
} else {
// wait one more cycle...
uiComp.callLater(runLater);
}
}
}
Проблема та же, что и при последующем вызове setProgress: мы должны разделить cpuIntensiveCalc на небольшие вызываемые методы, которые можно запускать в каждом цикле пользовательского интерфейса, в противном случае индикатор выполнения не будет ошибаться, прогресс.