【发布时间】:2011-05-21 02:30:02
【问题描述】:
我有一个带有 TWebBrowser 组件的 Delphi 6 Pro 程序,它加载一个嵌入 Cool Iris Wall 的网页。 Cool Iris 墙是一个 SWF 对象,这意味着在运行时,执行发生在 Adobe Flash 播放器、ActiveX 或我相信的类似对象中。我遇到的问题是,有时当 Wall 从 Web 加载图片/视频时,它会对主 UI 线程上的 CPU 造成很大影响。我知道 TWebBrowser 将其大部分操作移至后台线程以保持主 UI 线程快乐,但 Adobe Flash Player 正在做的事情正在主 UI 线程上发生,这导致我的程序非常痛苦。有没有办法将 Adobe Flash Player 移到后台线程?
[更新 - 2010 年 12 月 7 日] - 经过马拉松式的探测和调试会话后,发现问题与 Cool Iris Wall 的 Flickr 代理有关。您可以通过两种主要方式与 Wall 进行交互: 1) 您向他们传递特殊的 Flickr api 协议 URL,让他们为您与 Flickr 对话,例如“api://www.flickr.com/?search=puppy”加载墙与 Flickr 关键字搜索小狗的结果。这种方法的优点是它们为您完成了对 Flickr 进行查询和构建 Wall 内容所需的所有工作。 2) 您自己构建一个包含照片流项目数据的 RSS 媒体提要,并将其提供给 Wall。
我使用的是技术#1。 #1 的问题在于,当他们的服务器无法为您构建 Flickr 提要时(无论出于何种未知原因),他们的主机 SWF 会给 CPU 带来沉重的负载,从而干扰主 UI 线程的操作。我将整个代码库转换为直接使用 Flickr API 并使用第二种技术自己创建提要,问题就消失了。
-- 罗施勒
【问题讨论】:
-
我真的不喜欢人们投反对票但不添加评论来解释原因。
-
我对这个主题也很感兴趣,你查看过 adobe 的开发者文档吗?必须有办法做到这一点......但是,当您的 Flash 应用程序尝试加载大量对象时,我看到所有主要的浏览器都崩溃或冻结 - 如果有任何可能的话,我怀疑这个问题现在已经修复了方式,但是我可能是错的......
-
如果您还没有这样做,请尝试使用分析器更好地查明问题的根源。
-
@Lieven:我认为分析器在这种情况下不会显示任何有用的信息,因为 CPU 时间消耗发生在浏览器和/或 Flash Player 对象内部。
-
您确定 CoolIris 使用 Flash 吗?我以为它使用了自己的插件。 (事实上,我绝对 100% 确定。)值得检查。您可以使用 Mozilla 插件界面直接托管插件,这将绕过对 TWebBrowser 的需求,甚至可以从那里做所以在另一个线程中。
标签: multithreading flash delphi adobe twebbrowser