2013-06-04 39 views
0

我正在使用FDT6中的AS3項目。我正在使用最新的FLEX 4.6和AIR 3.7。可以MessageChannel溢出

我有一個worker.swf文件嵌入到主應用程序中,以執行線程工作。

我使用MessageChannel類在兩者之間傳遞信息。

在我的主類我已經在我只發送郵件的mainToWorker定義

private var mainToWorker:MessageChannel; 
private var workerToMain:MessageChannel; 

mainToWorker = Worker.current.createMessageChannel(worker); 
workerToMain = worker.createMessageChannel(Worker.current); 

。在這些消息中,我發送一個字節的信息數組。該信息是一個包含'command'屬性和'props'屬性的對象。基本上就像一個函數調用一樣。該命令是一個函數名稱,道具是一個包含該函數數據的對象。

mainToWorkerMutex.lock(); 
mainToWorker.send(ByteArrayUtils.ObjectToByteArray({command:"DoSomething", props:{propA:1,propB:7}})); 
mainToWorkerMutex.unlock(); 

workerToMain var同樣發生,除了我只發送包含'message'和'props'參數的字節數據。

workerToMainMutex.lock(); 
workerToMain.send(ByteArrayUtils.ObjectToByteArray({command:"complete", props:{return:"result"}})); 
workerToMainMutex.unlock(); 

作爲一個健全的檢查,我確保消息渠道得到他們應該得到的。

當我在FDT中構建它時,它工作的很好,但是當它使用通過flash構建器的ANT腳本構建時,我有時會收到通過workerToMain通道返回的「命令」事件。

我通過消息通道發送了很多數據。有可能我重載了它並導致緩衝區溢出到另一個消息通道?那怎麼可能只發生在FB?

我已經檢查了我的代碼很多次,並且我確信在我自己的代碼中沒有任何內容將該消息發送回去。

+0

作爲一個說明,我只是試圖在FDT之外的Web瀏覽器中運行正在運行的FDT,它看起來已經壞了。所以看起來FDT有一些問題與消息通道類有關,他們的SWF查看器已經得到了解決。 –

+0

也許由於在瀏覽器中從FDT運行SWF導致了一個問題,您應該也會看到在FDT swf播放器中運行或不運行時是否運行由ant腳本構建的swf。這樣您就可以確定它是否與執行(運行時)或編譯的上下文相關。 – shaunhusain

+0

根據文檔,您不應直接實例化這些文檔:您不通過調用MessageChannel()構造函數直接創建MessageChannel實例。要創建MessageChannel實例,請調用將在該通道上發送消息的Worker對象的createMessageChannel()方法,並將接收的Worker對象作爲參數傳遞。 http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/MessageChannel.html – shaunhusain

回答

0

因此,它看起來像我已經找到了問題。看起來像是ByteArray這樣做。

ByteArray.toString()基本上有時會破壞您的數據,這意味着您無法真正信任它。

http://www.actionscript.org/forums/showthread.php3?t=155067

如果你讀過「吉姆·弗里爾」的評論,他提到弦有時是如何做到這一點。

我的解決方案是切換到使用JSON編碼的字符串而不是消息通道中的ByteArray數據。我之前使用bytearray數據的原因是因爲我想保留JSON不支持的類定義信息。

0

我有類似的問題。當使用頻道發送很多字節碼時,有時我收到的東西並不是我實際發送的東西。我有4個通道(工作人員消息通道,主要消息通道,工作人員數據通道,主要數據通道)。

我注意到主要的數據通道影響到工作者的消息通道。當我關閉數據通道,以主要消息通道工人盯着工作就好:D ...

他們有一個很大的問題發送字節數組似乎。

但是幫助我用共享(在一開始是不共享)字節組爲通過渠道溝通,但僅限於溝通,只要我收到這樣的bytearray我正在將其複製到另一個字節數組,解析副本。

這樣取出的問題(由挺難的壓力測試有)...

乾杯

附:我也使用靜態函數(比如你的ByteArrayUtils)來創建用於通信的bytearray,但似乎很好,甚至使用非靜態函數進行測試。