MessageChannel可以溢出

时间:2013-06-04 18:47:02

标签: multithreading actionscript-3 flash

我正在FDT6中开展AS3项目。我正在使用最新的FLEX 4.6和AIR 3.7。

我有一个嵌入到主应用程序中的worker.swf文件,用于执行线程处理。

我正在使用MessageChannel类在两者之间传递信息。

在我的主要课程中,我已经定义了

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

mainToWorker = Worker.current.createMessageChannel(worker);
workerToMain = worker.createMessageChannel(Worker.current);
在mainToWorker上的

我只发送消息。在这些消息中,我发送一个字节数组信息。该信息是一个包含'command'属性和'props'属性的对象。基本上就像一个函数调用。该命令是函数名称,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?

我已多次检查我的代码,并且我确信我自己的代码中没有任何内容可以发回该消息。

2 个答案:

答案 0 :(得分:1)

我有类似的问题。当使用频道发送许多字节数时,我收到的东西有时并不是我实际发送过的东西。我有4个频道(消息通道到工作人员,消息通道到主要,数据通道到工作人员,数据通道到主要)。

我注意到main的数据通道正在影响到工作人员的消息通道。当我关闭数据通道到主消息通道时,工作人员盯着正常工作:D ...

它们在发送字节数组时遇到了一个大问题。

但是有什么帮助我使用可分享(起初它不可共享)bytearray通过频道进行通信,但仅用于通信,一旦我收到这样的bytearray我将其复制到另一个字节数组并解析副本。

这解决了问题(在那里进行了非常艰苦的压力测试)......

干杯

P.S。我也使用静态函数(比如你的ByteArrayUtils)创建用于通信的bytearray,但看起来很好,甚至使用非静态函数进行测试。

答案 1 :(得分:0)

所以,看起来我发现了这个问题。看起来像是ByteArray正在这样做。

ByteArray.toString()基本上有时会破坏你的数据,这意味着你无法真正信任它。

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

如果您阅读“Jim Freer”的评论,他会提到字符串有时会这样做。

我的解决方案是切换到在消息通道中使用JSON编码的字符串而不是ByteArray数据。我开始使用bytearray数据的原因是因为我想保留JSON不执行的类定义信息。