Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   mx:ProgressBar (http://www.flasher.ru/forum/showthread.php?t=133609)

xsingami 09.12.2009 01:36

mx:ProgressBar
 
Как бы так поточнее объясниить суть проблемы...

Имеем:
1)MXML программу, то есть окошко, в котором есть прогрес бар.
2)AS3 паблик класс Engine, в котором есть функция run(), которая производит обсчет двумерной таблицы (ну например 10000х10000).
3)Экземпляр eng класса Engine создан и хранится в (1). Engine знает (по ссылке) о внешнем прогресс баре.
4) Внутри цикла функции run() установлена bar.setProgress(j,100), то есть я пытаюсь визуализировать процесс работы "движка".

Почему никаких изменений в прогресс баре не происходит вплоть до окнчании работы функции run() - т.е. прогресс бар меняется только единожды - сразу на 100%.

Тоже самое происходит если вместо прогресс бара использовать просто Label с текстом.

Чего я не понимаю?

udaaff 09.12.2009 02:20

Цитата:

Чего я не понимаю?
Того, что сначала выполняется код в текущем кадре, а перерисовка происходит при переходе не следующий. А на следующий флеш не перейдет до тех пор, пока в предыдущем все вычисления не будут произведены.

bastrakov 09.12.2009 10:13

информации не достаточно, поэтому версии:
1) процесс обсчета занял все процессорное время, и тупо нет ресурсов еще что-то перерисовать.
2) binding сделан неверно.
во

xsingami 09.12.2009 10:58

1) По поводу перерисовки - во Flex все так же ?

2)Какой инф. недостаточно?

Ну попробую код выложить:

MXML:
Код AS3:

...
import my.engine.Engine;
private var eng:Engine = new Engine();
...
protected function goButton_Handler(event:MouseEvent):void
                {
                        var a:Array;
                        eng.bar = this.bar;
                        a = eng.calcRealGrid(Number(iMaxX.text),Number(iMaxY.text),Number(iN.text),
                                                                                                Number(iK.text),iRF.text);
                }
...
<mx:ProgressBar width="100%" minimum="0" maximum="100" indeterminate="true" enabled="true" id="bar"/>
...

Engine.as
Код AS3:

...
public dynamic class Engine
        {
                private var parser:Parser;
                public var bar:ProgressBar;
 
                public function Engine()
                {
                        parser = new Parser(["x","y"]);
                }
...
public function calcRealGrid(maxX:Number,maxY:Number,N:Number, K:Number,RFuncExpr:String):Array{
                        var grid:Array = createGrid(N+1,K+1);
                        var func:Func = new Func(parser,RFuncExpr);
                        var dx:Number = maxX/N;
                        var dy:Number = maxY/K;
 
                        for(var k:int = 0;k<K+1;k++){
 
                                bar.setProgress(k*100/K,100);
                                bar.label = k*100/K + "%";
 
                                for(var i:int = 0;i<N+1;i++){
                                        grid[k][i] = func.eval([dx*i,dy*k]);
                                }
                        }
                        return grid;
                }
...


udaaff 09.12.2009 11:23

Цитата:

1) По поводу перерисовки - во Flex все так же ?
Flex -- это надстройка над AS3.0. Фреймворк написанный на AS3.0. Естественно, все также.

xsingami 10.12.2009 01:01

так вопрос: есть ли возможность с помощью прогресс бара (или как то иначе) отобразить процесс работы долгой процедуры?

И здесь же спрошу:

как я понял, AIR - это приложения только "устанавливаемые" на машину, и их нельзя включить в HTML или еще куда-то?

udaaff 10.12.2009 01:09

Цитата:

Сообщение от xsingami (Сообщение 871614)
так вопрос: есть ли возможность с помощью прогресс бара (или как то иначе) отобразить процесс работы долгой процедуры?

И здесь же спрошу:

как я понял, AIR - это приложения только "устанавливаемые" на машину, и их нельзя включить в HTML или еще куда-то?

1. никак.
2. нельзя.

wvxvw 10.12.2009 02:55

Выстaвьте какие-нибудь колбеки наружу типа:
Код AS3:

while (i++ < Infinity)
{
    if (!(i % 1000)) updateProgressBar();
}

Или разбейте длинную процедуру на много маленьких и в конце каждой части обновляйте прогрес бар. ПроцесРаннеров и т.п. в AS3 нету.

Единственное но - во флеше есть ограничения на время выполнения. Если процесс не закончится по истечении определенног времени (во Флексе кажется по умолчанию 30 секунд), то получите ошибку. Ну и вообще, не стоит так делать. Флеш в таком случае может выбрать все ресурсы процессора и фактически повесит систему, ну, или как минимум браузер.

udaaff 10.12.2009 05:09

Цитата:

Сообщение от wvxvw (Сообщение 871622)
Выстaвьте какие-нибудь колбеки наружу типа:
Код AS3:

while (i++ < Infinity)
{
    if (!(i % 1000)) updateProgressBar();
}


Не понятно, каким образом это должно работать...

wvxvw 10.12.2009 16:15

Это не должно работать :) Сорри, если так не понянто:
Код AS3:

var i:int;
var lastTimeUpdated:int;
while (i++ < 10000)
{
    if ((i * 100 / 10000) >> 0 > lastTimeUpdated)
    {
        lastTimeUpdated = i * 100 / 10000;
        updateProgressBar(i / 10000);
    }
}
function updateProgressBar(percent:Number):void
{
        trace(percent);
}



Часовой пояс GMT +4, время: 07:53.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.