javascript - WinJS setInterval() 挂起

标签 javascript multithreading user-interface winjs

我正在努力创建自定义 UI 光标。光标位置是通过每 5 毫秒检查一些输入值并调整 DOM 元素上的 style.top 和 style.left 属性来确定的。通常这工作得非常顺利,但是我发现光标有时会挂起。我不太确定是什么原因造成的,但它似乎与 WinJS.xhr() 调用中请求缓慢返回有关。

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

最佳答案

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

不过,UI 线程上的任何阻塞工作都会阻塞光标刷新。 WinJS.xhr 不一定是这里的直接罪魁祸首——它基本上是 XMLHttpRequest 的包装器,它本身是一个在另一个线程上工作的异步调用。 但是,处理该请求结果的代码——也就是说,无论 WinJS.xhr 返回的 Promise 的完成处理程序中包含什么,会在用户界面线程。因此,如果您在那里做大量工作,您可能会阻塞一些刷新周期

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

您在这里要做的是以高优先级运行动画代码,并以正常或较低优先级运行 WinJS.xhr 完成的处理程序。

关于javascript - WinJS setInterval() 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24151733/

相关文章:

javascript - 通过js查看json api从url到html页面

c++ - 线程 C++ 上的用户 I/O

java - 发生某种情况后停止线程 ScheduledThreadPoolExecutor

python - tkinter-调整彩色图像大小时,仅以红色显示

macos - 完全可点击的 NSComboBox?

javascript - Angular + jQuery .on() 不适用于 ng-repeat

javascript - 如何动态调整vue组件中的文本大小

javascript - 我应该在 sinon.js 中模拟 cors OPTIONS 请求还是如何测试跨域 ajax 请求?

c# - 使用 while(true) 定期执行任务

java - 无法输出到GUI,可以输出到控制台