1

我正在 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 是一个包含该函数数据的对象。

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 builder 使用 ANT 脚本构建时,我有时会在 workerToMain 通道中返回“命令”事件。

我正在通过消息通道发送大量数据。是否有可能我超载它并以某种方式导致缓冲区溢出到另一个消息通道?这怎么可能只发生在FB?

我已经检查了很多次我的代码,并且我确信我自己的代码中没有任何东西会发回该消息。

4

2 回答 2

1

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

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

他们似乎在发送字节数组方面存在很大问题。

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

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

干杯

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

于 2013-11-24T20:56:15.210 回答
0

所以,看起来我已经找到了问题所在。看起来是 ByteArray 正在做的。

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

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

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

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

于 2013-06-05T18:40:06.687 回答