Jan Lipmann

Jan Lipmann CEO/Founder @ Likomp
iOS Development

Temat: ProgressBar podczas wykonywania petli w AS

Witam,

Pisze aplikacje w AIR, która za zadanie ma sczytać informacje o wszystkich plikach na wskazanym dysku.

Wszystko juz dziala elegancko, teraz chcialbym aby przy tej operacji pojawial sie progressBar.

Niestety jakos nie oge tego ogarnąć.

Trzeba stworzyc jakiego Custom Eventa i go Dispatchowac :)

Niestety nie wiem jak sie do tego zabrac.

Moze ktos z was doswiadczonych kolegow mi to wyjasni:)

z gory dziekuje

konto usunięte

Temat: ProgressBar podczas wykonywania petli w AS

Jan Lipmann:
Witam,

Pisze aplikacje w AIR, która za zadanie ma sczytać informacje o wszystkich plikach na wskazanym dysku.

Wszystko juz dziala elegancko, teraz chcialbym aby przy tej operacji pojawial sie progressBar.

Niestety jakos nie oge tego ogarnąć.

Trzeba stworzyc jakiego Custom Eventa i go Dispatchowac :)

Niestety nie wiem jak sie do tego zabrac.

Moze ktos z was doswiadczonych kolegow mi to wyjasni:)

z gory dziekuje

a co chcesz progresowac?

Ilosc czy wielkosc plikow ?Sylwester Gąsiewski edytował(a) ten post dnia 25.11.09 o godzinie 16:45
Daniel Mroczka

Daniel Mroczka Experienced Java
Developer

Temat: ProgressBar podczas wykonywania petli w AS

Najciemniej pod latarnią :P
link do dokumentacji: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRe...
Jan Lipmann

Jan Lipmann CEO/Founder @ Likomp
iOS Development

Temat: ProgressBar podczas wykonywania petli w AS

Dzieki za odpowiedzi, ale nie do konca o to chodzi.

Program nie sciaga adnych plikow tylko w funkcji rekurencyjnej sczytuje informacje o wszystkich plikach i zapisuje je do tablicy.


private function archive_r(path:File):void
{
var filesTMP:Array = path.getDirectoryListing();
for (var i:uint = 0; i < filesTMP.length; i++) {
if (filesTMP[i].isDirectory){
archive_r(filesTMP[i]);
}
else
{
if(filesTMP[i].isHidden == false){
var name:String = filesTMP[i].name.toString();
var size:String = filesTMP[i].size.toString();
var creationDate:String = filesTMP[i].creationDate.toString();
var sciezka:String = filesTMP[i].nativePath.toString();
var zestaw:Array = new Array(name,size,creationDate,sciezka);
files.push(zestaw);
}
}
}

}


Chce aby podczas czytania tych plikow cos sie dzialo, moze byc nawet state z oknem LOADING, zrobilem nawet taki state ale wcale w niego nie przechodzi :)

Please o pomocJan Lipmann edytował(a) ten post dnia 26.11.09 o godzinie 10:01

Temat: ProgressBar podczas wykonywania petli w AS

Zapomniałeś, że AVM jest jedno wątkowy, więc takie operacje musisz robić asynchronicznie... Poczytaj sobie o tym jak działa Flashowa wirtualna maszyna, to Ci wiele wyjaśni i rozwiąże mnóstwo problemów, szczególnie we Flexie. (np. dlaczego nie chce przejść do następnego state'a, chociaż pewnie zmieniałeś go przed tymi złożonymi obliczeniami ;) )

Co do progressBara to najlepiej przed wczytywaniem policzyć wszystkie pliki(jeśli oczywiście nie będzie to zbyt czasochłonne, ewentualnie zastosować jakiś ciekawy szacujący algorytm :) )
No i na takiej podstawie wczytanej ilości elementów możesz obliczyć progrss.

Tylko taj jak wspominałem wcześniej całość musi być asynchroniczna!
(code->rendering->code->rendering...)

konto usunięte

Temat: ProgressBar podczas wykonywania petli w AS

Oj, widze jedno zagrozenie - z powodu braku wielowatkowosci w samym AIR-ze pod Windowsem wpadnie Ci w stan "Not Responding".

A jezeli chodzi o Twoj komponent - czy nie najlatwiej bedzie go zrobic samemu jako komponent skladajacy sie z jakiegos Labela i ProgressBara, jak to sam napisales z napisem "Loading" i wyswietlic przed rozpoczeciem tej akcji i schowac po?

Pozdrowienia,
W.

konto usunięte

Temat: ProgressBar podczas wykonywania petli w AS

.Ten post został edytowany przez Autora dnia 26.07.22 o godzinie 13:53
Jan Lipmann

Jan Lipmann CEO/Founder @ Likomp
iOS Development

Temat: ProgressBar podczas wykonywania petli w AS

@Wojtek Olech
Masz racje probowalem zmieniac state przed ta funkcja i zaraz po jej wykonaniu (w C# dziala to bez problemu), ale tak jak mówił drugi Wojtek AIR niestety jest jedno watkowy.

@Wojciech Ptak
NotResponding dostaje na OSX-ie wiec to norma, boje sie, ze uzytkownik bedzie wyłączał aplikacje zanim ona wczyta wszystkie dane, dlatego chcialem aby cos fajnego pokazywal podczas czytania. Testy robilem na 12000 plikach i trwalo to z 15 sek.

@Robert Bąk
Dzieki znalazłem to wcześniej, ale to działa chyba na ładowaniu pliku, a nie podczas wykonywania zpętli w kodzie :(

Reasumując:

Nie macie pomysłu co mozna zrobić w takiej sytuacji. W najgorszym przypadku mozna uprzedzić usera, ze program moze wejsc w stan NotResponding, tylko problem jest wtedy kiedy naprawde z jakiegos innego powodu wejdzie w ten stan i wtedy malo rozgarniety user bedzie czekal w nieskonczonosc :)

Temat: ProgressBar podczas wykonywania petli w AS

Nie zastosowałeś się do moich uwag :) w nich było wszystko :D
Jeśli pętle zrobisz asynchronicznie aplikacja AIR/WEB nie wpadnie w stan 'NotResponding'

Przykład podany przez Roberta jest jak najbardziej Ok i możesz się na nim wzorować, ja zamiast setTimeout użył bym we Flexie callLater

pzdr!

konto usunięte

Temat: ProgressBar podczas wykonywania petli w AS

.Ten post został edytowany przez Autora dnia 26.07.22 o godzinie 13:53
Jan Lipmann

Jan Lipmann CEO/Founder @ Likomp
iOS Development

Temat: ProgressBar podczas wykonywania petli w AS

@Wojtek
Poniekąd rozumiem, że chodzi o coś takiego?


currentState="info";

/* rekurencja po dysku */
callLater(archive_r,[path]);
currentState="3";


Niestey nie przyniosło to rezultatu.

Musze chyba przeanalizowac te aplikacje podeslana wczesniej przez Roberta.
Marcin W.

Marcin W.
TI/IT/VM/HT/PC/XP/AD
/SE/XL/XE/AS/TB/CP/J
S/JV

Temat: ProgressBar podczas wykonywania petli w AS

witam, rozwiązanie, które stosuję od bardzo dawna w grach - polegaja na wydzieleniu metod pojedyńczego kroku i wywoływaniu "ile się da" co event czasowy - np. przez setInterval co 33 (1000/FPS)milisekundy - wygląda to mniej więcej tak:
var _endtime:Number = getTimer() + 30;
while (_endTime > getTimer())
{
action1.doOneStep();
action2.doOneStep();
}

zamiast np. zwykłego for-a - co powoduje, że pętla jest przerywana na czas oczekiwania na następną klatkę.

//EDIT: oczywiście trzeba jeszcze później zadbać o wyrejestrowanie z pętli interwałowej :-)
// 30 w kodzie to "dowolny czas trwania pętli (ms) mniejszy od 33 (1000/FPS)"Marcin MaW W. edytował(a) ten post dnia 26.11.09 o godzinie 15:24

konto usunięte

Temat: ProgressBar podczas wykonywania petli w AS

.Ten post został edytowany przez Autora dnia 26.07.22 o godzinie 13:53
Jan Lipmann

Jan Lipmann CEO/Founder @ Likomp
iOS Development

Temat: ProgressBar podczas wykonywania petli w AS

Chyba nie ogarniam, albo zmeczenie materialu.

Rozwiazanie Roberta w takiej formie jak je napisale dziala, ale w zaden sposob nie ppotrafie go wstawic w swoj kod.

Czy mógłbyś Robercie spróbowac użyć swojego rozwiązania w moim kodzie.

(kod w historii postu).

Byłbym wdzięczny. Całe życie człowiek się uczy.
Adam Adamczyk

Adam Adamczyk Prezes Zarządu,
Figaro Software sp.
z o.o., NowyInteres
S...

Temat: ProgressBar podczas wykonywania petli w AS

W air 2.0 samples
jest przyklad jak zrobic progress podczas sczytywania
plikow z katalogu (FileTile), mozesz zaadopotować do swojego kodu.

http://labs.adobe.com/technologies/air2/samples/
Jan Lipmann

Jan Lipmann CEO/Founder @ Likomp
iOS Development

Temat: ProgressBar podczas wykonywania petli w AS

fajne to AIR2, ale niestety nie moge przejsc na bete :(

Musze to zrobic na 1.5;
Jan Lipmann

Jan Lipmann CEO/Founder @ Likomp
iOS Development

Temat: ProgressBar podczas wykonywania petli w AS

@Adam Adamczyk

Przejrzałem kod i aplikację, do której link podałes i okazuje sie, że ten ProgressImage pokazuje się juz po załadowaniu plików. Program ma ograniczenie do 200 plikow, wiec laduja sie szybko i nie ma problemu NotResponding
Jan Lipmann

Jan Lipmann CEO/Founder @ Likomp
iOS Development

Temat: ProgressBar podczas wykonywania petli w AS

Ok, rozwiązanie wyglada tak:

http://www.adobe.com/devnet/air/flex/quickstart/direct...



Wyślij zaproszenie do