我正在尝试解密我的opne-source项目中的加密视频SparrowPlayer(https://github.com/yatsen-yang/SparrowPlayer),and我发现解密视频可能会阻塞主线程几秒钟。这导致停止在舞台上渲染UI资源,这是不可接受的。所以我认为'工作人员可以提供一些帮助。我按照关于工作人员的在线API的示例代码(http://help.adobe.com/zh_CN/FlashPlatform/reference/actionscript/3/flash/system/Worker.htm l)。我测试了它并且运行良好。
但是我发现如果我将BGWorker.swf嵌入到com.xx.Test之类的其他类而不是文档类中,那么' Worker'没有那么好的工作。有时候,即使bgworker的状态正在运行,主要工作人员也无法与bgworker沟通。 示例代码如下:
private function handleBGWorkerStateChange(event:Event):void
{
if (bgWorker.state == WorkerState.RUNNING)
{
_statusText.text = "Background worker started";
bgWorkerCommandChannel.send(["startCount", 100000000]);
}
}
有时发生,而不是每次都发生。如果主要工作人员在听到bgworker运行状态后1秒钟后发送消息,则代码运行良好
所以它让我很困惑。从逻辑上讲,如果bgworker的状态正在运行,它应该意味着主要工作者可以与bgworker进行通信,如果你将bgworker swf嵌入到文档类中,它就可以正常工作。但是如果你将bgworker swf嵌入到其他类中,你将拥有问题有时候。
最后,我找到了一个解决方案。我将bgworker swf嵌入到其他类而不是文档类中,当bgworker成功初始化时,它向主worker发送消息。如果收到消息,主工作者立即与bgworker通信来自bgworker。现在问题解决了。
我想知道为什么当我将bgworker swf嵌入到其他类中时,Worker的状态不可靠。这是一个工人的错误吗?
答案 0 :(得分:1)
问题问题已经过去2年了,但对于遇到类似问题的人来说,这是因为RUNNING状态只是表明构造函数已经启动了。它可能还没有完成执行;因此,一个解决方法是发送一个"完成启动"来自工人SWF的消息。
您可能想要使用内置的WorkerState事件来同步线程启动。通过简单地监听WorkerState.RUNNING事件来避免上面看到的额外步骤非常有吸引力:
不要被愚弄! RUNNING状态仅表示已创建Worker并开始执行其构造函数。它可能已经或可能没有完成它的构造函数,因此很可能由于工作线程没有完成自我设置而导致间歇性问题。 “启动”MessageChannel可以避免这种可能性并确保顺利启动线程。
答案 1 :(得分:-1)
我不熟悉SparrowPlayer和Worker API。但看起来这是初始化时的问题。当您的类在被调用时未初始化时,它将失败。
当你将它移动到一个单独的类并初始化时,你向worker.main类发送一条消息,它的工作原理是因为你的worker每次都被启动,这保证了它在被调用之前的初始化。
初始化显示对象/元素的一种方法是在主应用程序中将CreationPolicy设置为All。