DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   Flash (http://www.devprotalk.com/forumdisplay.php?f=17)
-   -   Pucanje while() u busy wait-u (http://www.devprotalk.com/showthread.php?t=3354)

rangy 12. 08. 2007. 18:05

Pucanje while() u busy wait-u
 
Pozdrav,

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

Kôd:

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:

Kôd:

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

Kôd:

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:

Citat:

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

Kôd:

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

Kôd:

mc.onEnterFrame = function() {
 
  if (playing) {
     
  } else {

  }

}

sve dok ne uradis
Kôd:

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


Vreme je GMT +2. Trenutno vreme je 01:19.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.