2009-09-19 56 views
11

我有一个CPU密集型工作要做,我不想降低用户体验。由于网络工作者(http://ejohn.org/blog/web-workers/)是一项新功能,并且不被所有浏览器支持,我以为可以使用HTML + JS打开一个iframe,它将完成所有肮脏的工作,并使用一些跨域通信传递结果。 不幸的是我注意到iframe的所有者患有iframe窗口的CPU工作。iframe是否与所有者在同一个线程上运行?

此行为是否按设计?有没有办法解决这个问题?

回答

8

一种模拟多线程的方法是让Javascript函数做一点工作,然后用setTimeout调用相同的函数;那么该功能将会做一些工作,并再次呼叫setTimeout,并且这个循环会一直持续下去,或者直到它们关闭帧或者您发出信号停止工作。 MDN has a good example of how to set this up.

在超时之间,Javascript不应该消耗任何处理器时间。您可能需要稍微玩一下,看看您的超时时间应该多长 - 1毫秒可能太短,但1秒肯定会太长。另一个因素是计算机运行该作业的处理器速度,因此您可能需要通过Javascript在客户端执行一些伪基准测试,然后才能确定每次延迟多长时间。

+6

w3schools!= W3C – 2009-09-19 20:19:51

+0

16ms是屏幕刷新,我推荐。 – Fresheyeball 2013-08-08 18:32:38

4

JavaScript是单线程的。单独的选项卡或窗口可能在单独的线程或进程中运行,具体取决于浏览器,但是无法在这些窗口之间进行通信,因此您无法在JavaScript中明确使用多个线程或进程。

如果这是一个UI响应问题,Rushakoff有一个很好的答案。在JavaScript运行时,不会发生HTML呈现,并且UI不响应。通过使用超时,控制可以定期释放回渲染/ UI线程,从而给出更快的响应感,即使它仍然只运行单线程。

+5

>但是你不能在这些窗口之间进行通信 'postMessage' – 2009-10-14 20:26:32

相关问题