PDA

Pogčedajte punu verziju : Pucanje while() u busy wait-u


rangy
12. 08. 2007., 18:05
Pozdrav,

Imam sledeci problem. Hocu da napravim da se 5 pesama pustaju jedna za drugom. Probao sam sa sledecim kodom.

var pesma:Sound = new Sound();
playing = false;

pustiPesmu_mc.onRelease = function () {
for (i = 0; i<5; i++){
while (playing) {}
pesma.attachSound("sound"+i);
playing = true;
pesma.start();

}
}

pesma.onSoundComplete = function () {
playing = false;
}

Medjutim, Flash je puko na while-u (u ovom slucaju sam proba da resim sa tzv. busy-wait-om)

Dakle pitanje je zasto se "while (playing) {}" blokira iako bi onSoundComplete trebao da je odblokira?


Dalje sam preradio kod i proradio je:

var pesma:Sound = new Sound();
playing = false;

pustiPesmu_mc.onRelease = function () {
i = 0;
pesma.attachSound("sound"+i);
pesma.start();

}

pesma.onSoundComplete = function () {
if (++i < 5) {
pesma.attachSound("sound"+ i);
pesma.start();
}
}

Da li neko mozda zna neki bolji nacin, ovo mi izgleda malo "na silu"?

MrSteel
12. 08. 2007., 18:26
while ti se zapucava zato sto non stop ides u krug u loop-u
takodje, greska je for i attachovanje svih pesama itd.

flash je frame based tako da se izvrsi sve to ima na frejmu pa tek onda prelazi na sledeci a tebi nikad nece preci na sledeci, odn. oce za 3 minuta koliko flash ne moze da ceka na jednom frejmu ;

dakle

razbi to na 2-3 funkcije
nextSong ce vratiti sledecu pesmu vodeci racuna o ukupnom broju pesama
playSong treba da pusti odredjenu pesmu
onSoundComplete ce da izbaci event kada se pesma zavrsi i pozvace sledecu da se pusta

za kliktanje mc_play ce da pusti trenutnu pesmu
mc_next sledecu
a mc_prev proslu


var pesma: Sound = new Sound();

var totalSongs : Number = 5;
var currSong : Number = 0;

function nextSong(currSong:Number):Number {

var tempNumber : Number = currSong+1;
if (currSong >= totalSongs) {
tempNumber = 0;
}
return tempNumber;
}

function prevSong(currSong:Number):Number {

var tempNumber : Number = currSong-1;
if (currSong < 0) {
tempNumber = totalSongs-1;
}
return tempNumber;
}

function playSong(song:Number):Void {

pustis pesmu sa brojem song koristeci sound.attachSound // to znas izgleda treba da vodis racuna da prethodnu unistis

}

pesma.onSoundComplete == function() {

playSong(nextSong(currSong));

}



mc_play.onRelease = function() {
playSong(currSong);
}

mc_next.onRelease = function() {
playSong(nextSong(currSong));
}

mc_prev.onRelease = function() {
playSong(prevSong(currSong));
}

rangy
12. 08. 2007., 20:32
Hvala na odgovoru..mada i dalje mi nije jasno sledece:

flash je frame based tako da se izvrsi sve to ima na frejmu pa tek onda prelazi na sledeci a tebi nikad nece preci na sledeci, odn. oce za 3 minuta koliko flash ne moze da ceka na jednom frejmu

Medjutim ovde radim sve na jednom frameu..ovde si pretpostavljam mislio da pesma traje recimo 3min..ali sta ako imam neki zvuk koji traje 2s..while() se i dalje blokira umesto da onSoundComplete to lepo odblokira

Evo jedan slican primer


pres = false;

dugme_mc.onPress = function () {
pres = true;
}

while(!pres){}

Ali i ovde se zakuca iako bi onPress trebao da odblokira while petlju. Izgleda da je kod AS-a nemoguce napraviti busy wait jer se while() blokira nedozvoljavajuci prekid od strane usera. Zar nije malo bezveze sto AS2/AS3 nema koncept niti (threads),zastitu kriticne sekcije, prekide..

MrSteel
12. 08. 2007., 21:08
mogu ti pomoci oko pitanja za flash
granice postoje nazalost ali nisu uopste tako neverovatne i moguce ih je sasvim lepo zaobici u vecini slucajeva

flash nije java i tu mozemo zavrsiti pricu oko ozbiljnog programiranja
mozda u nekim sledecim verzijama za sada ima i precih stvari

dakle, bitno je sad kad vec ulazis u svet flash-a da skapiras koja su ogranicenja
na "silu" kao sto ti rece ne moze

to sto si ti pokusao da uradis je svakako po meni losa tehnika bilo koji programski jezik da koristis,
eventi su stvarno za programiranje melem, pozoves pusti sledecu pesmu kada se zavrsi trenutna
zato i postoji onSoundComplete, nikakav wait ti onda ne treba

e sad
ako nesto zelis stalno da proveravas
postoji nesto sto se zove
onEnterFrame
pogledaj u helpu
sve sto stavis u recimo donji pr, se izvrsava na svakom frejmu

mc.onEnterFrame = function() {

if (playing) {

} else {

}

}

sve dok ne uradis
delete mc.onEnterFrame;

ali to je samo za opravdane koncepte i potrebe jer nema potrebe opterecivati procesor
flash je veoma zahtevna VM, jer je prosto takva ali popravlja se, zato treba to da imas na umu kada radis u flashu

baci jos neka pitanja ako te zanima nesto