WinJS setInterval()挂起

时间:2014-06-10 22:15:04

标签: javascript multithreading user-interface winjs

我正致力于创建自定义UI光标。通过每5ms检查一些输入值并调整DOM元素上的style.top和style.left属性来确定光标位置。通常这很顺利,但我发现光标有时会挂起。我不确定导致这种情况的原因,但它似乎与在WinJS.xhr()调用中缓慢返回的请求有关。

有没有更好的方法来更新我的光标UI,以保持其顺利运行?我可以使用另一个线程吗?

1 个答案:

答案 0 :(得分:1)

请注意,5ms对于屏幕刷新周期来说太快了。 60Hz的屏幕将以16.7ms的间隔刷新,因此没有理由使用较短的间隔。在这种情况下,您希望使用requestAnimationFrame而不是setInterval,因为您知道您的UI工作将与屏幕刷新对齐。否则,由于未对齐,您肯定会在光标动画中删除一些帧。

但是,UI线程上的任何阻止工作都会阻止您的游标刷新。 WinJS.xhr不一定是这里的直接罪魁祸首 - 它基本上是XMLHttpRequest的包装器,它本身就是一个在另一个线程上工作的异步调用。 但是,处理该请求结果的代码 - 也就是说,无论你在WinJS.xhr返回的promise的已完成处理程序中有什么内容,运行在UI线程。所以如果你在那里做了很多工作,你可能会阻止一些刷新周期

不幸的是,JavaScript并没有让您直接访问创建单独的线程。 WinJS。但是,确实为此提供了调度机制。查看http://msdn.microsoft.com/en-us/library/windows/apps/dn301978.aspxhttp://try.buildwinjs.com/default.aspx#scheduler。我还在Windows开发博客上写了一篇文章:Managing the JavaScript UI thread with the WinJS Scheduler

您在此处执行的操作是以高优先级运行动画代码,并以正常或较低优先级运行WinJS.xhr已完成处理程序。