Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Can消息通道溢出_Multithreading_Actionscript 3_Flash - Fatal编程技术网

Multithreading Can消息通道溢出

Multithreading Can消息通道溢出,multithreading,actionscript-3,flash,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.createMessageChan

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

mainToWorkerMutex.lock();
mainToWorker.send(ByteArrayUtils.ObjectToByteArray({command:"DoSomething", props:{propA:1,propB:7}}));
mainToWorkerMutex.unlock();
WorkerDomain变量也会发生同样的情况,只是我只发送包含“message”和“props”参数的字节数据

workerToMainMutex.lock();
workerToMain.send(ByteArrayUtils.ObjectToByteArray({command:"complete", props:{return:"result"}}));
workerToMainMutex.unlock();
作为一种理智的检查,我确保消息通道得到了他们应该得到的

当我在FDT中构建它时,它运行良好,但是当它通过flash builder使用ANT脚本构建时,我有时会在WorkerDomain通道中获得“命令”事件

我通过消息通道发送了大量数据。是否有可能是我过载了它,导致缓冲区溢出到另一个消息通道中?这怎么可能只发生在FB


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

因此,看起来我发现了问题所在。看来是拜特利干的

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

如果你阅读“Jim Freer”的评论,他会提到字符串有时是如何做到这一点的


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

因此,我似乎发现了问题所在。看来是拜特利干的

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

如果你阅读“Jim Freer”的评论,他会提到字符串有时是如何做到这一点的


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

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

我注意到,到main的数据通道影响到到到worker的消息通道。当我关闭数据通道到主通道-消息通道到工人开始工作很好:D

他们在发送字节数组方面似乎有一个大问题

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

这就解决了问题(在那里进行了相当艰难的压力测试)

干杯


另外,我也在使用静态函数(比如你的ByteArrayUtils)来创建用于通信的bytearray,但它看起来不错,甚至使用非静态函数进行了测试。

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

我注意到,到main的数据通道影响到到到worker的消息通道。当我关闭数据通道到主通道-消息通道到工人开始工作很好:D

他们在发送字节数组方面似乎有一个大问题

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

这就解决了问题(在那里进行了相当艰难的压力测试)

干杯


另外,我也在使用静态函数(比如你的ByteArrayUtils)来创建用于通信的bytearray,但它似乎很好,甚至使用非静态函数进行了测试。

作为说明,我只是尝试在FDT之外的web浏览器中运行正在工作的FDT构建,它看起来好像坏了。因此,FDT在swf查看器中使用的messagechannel类似乎存在一个问题。也许因为在浏览器中从FDT运行swf导致了一个问题,所以您还应该查看在FDT swf播放器中执行时运行从ant脚本构建的swf是否有效。通过这种方式,您可以确定它是否与执行(运行时)或编译的上下文相关。根据文档,您不应该直接实例化它们:您不应该通过调用MessageChannel()构造函数直接创建MessageChannel实例。要创建MessageChannel实例,请调用将在通道上发送消息的Worker对象的createMessageChannel()方法,并将接收Worker对象作为参数传递。现在的最后一点意见是,我没有看到任何硬设置的限制,一般来说,如果没有明确的限制,您只会限制在设备RAM上。在send方法中似乎只提到了限制:我编辑代码以显示我实际使用的内容。我只是在快速输入。我的错误。请注意,我只是尝试在FDT之外的web浏览器中运行正在工作的FDT构建,但它看起来好像坏了。因此,FDT似乎解决了messagechannel类的一个问题