2010-01-20 80 views
2

我見過很多其他開發人員參考ActionScript函數中的線程。作爲一個新手,我不知道他們指的是這樣的:actionscript函數中的線程是什麼?

什麼是這種意義上的線程?
我該如何一次運行多個線程?
如何確保我一次只運行一個線程?

感謝 〜邁克

回答

6

線程代表了一種有一個程序出現同時執行多個作業。雖然作業是否可以同時發生實際上取決於幾個因素(最重要的是,程序運行的CPU是否具有多個可用於執行工作的內核)。線程很有用,因爲它們允許在一個上下文中完成工作而不會干擾另一個上下文。

一個例子將有助於說明爲什麼這很重要。假設你有一個程序獲取電話簿中名字匹配某個字符串的每個人的列表。當用戶點擊「搜索」按鈕時,會觸發耗時且耗時的搜索,可能會在幾秒鐘內完成。

  • 如果您只有單線程執行模型,則用戶界面將掛起並且無法響應,直到搜索完成。你的程序別無選擇,只能等待結果完成。

  • 但如果你有多個線程,你可以卸載的搜索操作不同的線程,然後有一個回調 - 當工作完成時調用的觸發器 - 讓你知道的事情準備好了。這釋放了用戶界面,並允許它繼續響應事件。

不幸的是,由於ActionScript的執行模型本身不支持線程,因此無法獲得真正的線程。有一個粗略的近似稱爲「綠色線程」,它是由執行上下文或虛擬機控制的線程,而不是更大的操作系統,這是通常的做法。雖然我不能說它們的用途有多廣泛,但有幾個人對此有所暗示。您可以閱讀Alex Harui的博客here並查看ActionScript here的綠色線程示例。

+0

聽起來很像Stackless Python的微螺紋。 – KingRadical 2010-01-20 20:00:29

+1

儘管AS3代碼無法創建真正的線程,但Flash Player本身是多線程的,許多操作都會使操作在單獨的線程上生效,如網絡調用。 – 2010-01-23 04:39:33

4

這真的取決於你的意思。 ActionScript的執行模型是單線程的,這意味着它無法在後臺運行進程。

如果你不熟悉線程,它本質上是在主進程的後臺執行某些東西的能力。因此,如果您需要在flex/flash項目中進行巨大的數學計算,那麼使用多線程程序,您可以在後臺執行此操作,同時更新UI。因爲ActionScript不是多線程的,所以你不能做這樣的事情。但是,您可以創建一個僞線程類作爲這裏演示:

http://blogs.adobe.com/aharui/pseudothread/PseudoThread.as

0

一個線程可以讓你通過,你總是會在相同的默認線程執行默認同時放執行actionscrpt的兩個或更多塊,除非你explcitly啓動一個新線程。

2

的其他人描述的是什麼的線程,和你需要的線程,如果你都拿到骨灰級到C++和3D遊戲引擎,很多其他計算昂貴的操作中,並且支持多線程的語言。

Actionscript沒有多線程。它在一幀中執行所有代碼。因此,如果您創建處理100,000,000個項目的for循環,則會導致應用程序凍結。這是因爲Flash Player每幀只能執行一個代碼線程。

您可以通過實現僞線程:

  • 定時器
  • Event.ENTER_FRAME

那些讓你跳來跳去並執行代碼。

類似TweenMax這樣的吐溫引擎可以在幾秒鐘內使用定時器在1000's of objects at once上運行。你也可以用Event.ENTER_FRAME來做到這一點。有一種叫做「chunking」的東西(檢查出Grant Skinner's AS3 Optimizations Presentation),它說「在幾個幀上執行計算量很大的任務」,就像繪製複雜的位圖一樣,這是一個可以用actionscript做的僞多線程事情。

許多其他事情是異步的,如服務調用。如果您在Flex中發出HTTPService請求,它將向服務器發送請求,然後繼續在該幀中執行代碼。一旦完成,服務器仍然可以處理該請求(假設它將30mb視頻保存到服務器上的數據庫中),而這可能需要一分鐘。然後它會發回一些東西回到Flex,你可以用ResultEvent.RESULT事件處理程序繼續執行代碼。

所以基本的ActionScript使用:

  • 異步事件,並
  • 定時器...

...實現僞多線程。