Flash的執行機制 非同步單執行緒

2021-08-31 08:47:53 字數 1274 閱讀 1615

2008-12-14 23:32:44    分類:flash技術 | 

flash和我們平時常用的php之間最大的區別就在於其非同步執行機制。這個非同步機制最明顯的表現在於「載入」,或稱「網路通訊」。

比如說php執行一句sql,我們通常會這樣寫:

$db_somedb->query($sql);

//接下來的**

php順序執行,執行sql之後才會繼續下面的語句,但是as不會。所有涉及到網路通訊的操作,均會被flash player分配給專門的程序處理,而主程式的執行不受影響。比如用as載入一副,如果這樣寫:

_my_loader.load(new request('路徑'));

addchild(_my_loader.content);

就不會將目標載入到舞台上,因為_my_loader開始載入後,載入方法被flash player專門進行,而程式執行的順序不變,於是馬上執行下一步;要知道程式在電腦上執行的速度是遠遠大於網路傳輸載入的速度的,於是乎執行addchild把目標放在舞台時裡面尚無任務影象資訊,所以程式就會出錯,正確的寫法是這樣的:

_my_loader.contentloaderinfo.addeventlistener(event.complete,pic_load_complete);

_my_loader.load(new request('路徑'));

private function pic_load_complete(evt:event=null):void

我們使用乙個偵聽器來偵聽載入結束的時間,確保所有的資料都載入完成之後再把目標影象放到五台上,如此便不會出錯了。這樣又會給我們乙個感覺,是不是flash是多執行緒的,每次單獨分配乙個執行緒來進行這樣的非同步操作呢?

也不是。這裡必須提到flash另外乙個極其重要的概念「幀」。雖然到現在,flash開發已經幾乎放棄了對幀的使用,但我們必須明白,如今flash的機制,依然是建築於幀之上的。

幀對於flash來說是乙個「定時器」,fp會定時輪巡所有的非同步物件,並且將其狀態傳送出來。回到上面那個例子,_my_loader發出載入命令後,fp中專門負責載入的部門開始運作(其實是把這個事件加入任務,在主程式執行之餘執行),每到一幀,flash會檢查這個載入的運作情況,把已載入到的位元組數通過progressevent.progress廣播出去,直到最後某次檢查,發現全部載入完畢,就廣播complete事件。所有的網路通訊部分都是這樣執行的。

於是可以看出,幀數的設定對於flash開發也是至關重要的。設定太高,不斷輪巡會造成資源浪費;設定太低,很多基於幀的非同步狀態檢查都會有延遲。由經驗得出的:25~30幀會是比較好的選擇。

Flash的執行機制 非同步單執行緒

flash的執行機制 非同步單執行緒 flash和我們平時常用的php之間最大的區別就在於其非同步執行機制。這個非同步機制最明顯的表現在於 載入 或稱 網路通訊 比如說php執行一句sql,我們通常會這樣寫 db somedb query sql 接下來的 php順序執行,執行sql之後才會繼續下面...

非同步和單執行緒

什麼是非同步 對比同步 非同步 不會有阻塞 console.log 100 settimeout function 1000 console.log 300 同步 會阻塞,需要等待確認後才會繼續執行 console.log 100 alert 200 console.log 300 前端使用非同步的...

單執行緒和非同步

非同步 async 是相對於同步 async 而言的,同步就是一件事一件事的執行。只有前乙個任務執行完畢,才能執行後乙個任務。當js解析執行時,會被引擎分為兩類任務,同步任務 synchronous 和 非同步任務 asynchronous 對於同步任務來說,會被推到執行棧按順序去執行這些任務。對於...