Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有可能';螺纹';Javascript并保持对UI的访问?_Javascript_Html_Multithreading_User Interface - Fatal编程技术网

有没有可能';螺纹';Javascript并保持对UI的访问?

有没有可能';螺纹';Javascript并保持对UI的访问?,javascript,html,multithreading,user-interface,Javascript,Html,Multithreading,User Interface,我想在主进程和线程都可以自由更新浏览器UI的情况下线程一些Javascript代码 例如: function StartStuff() { StartThreadedCode(); // do more work and update the UI while StartThreadedCode() does its work } function StartThreadedCode() { // do stuff (do work and update the UI)

我想在主进程和线程都可以自由更新浏览器UI的情况下线程一些Javascript代码

例如:

function StartStuff() {
    StartThreadedCode();
    // do more work and update the UI while StartThreadedCode() does its work
}

function StartThreadedCode() {
    // do stuff (do work and update the UI)
}

有可能吗?

Javascript是单线程语言,但您可以使用一些技巧来模拟多线程:


在Javascript中实现“多线程”有两种主要方法。第一种方法是跨浏览器解决方案,它也适用于较旧的浏览器,但实现起来更复杂

其背后的想法是给UI一些时间每隔一段时间更新一次。由于Javascript中没有同步睡眠函数,因此实现这一点的唯一方法是使用setTimeout(或逻辑稍微复杂一点的setInterval)延迟复杂计算的每个循环的执行。这将给浏览器一些时间来更新循环之间的UI,从而提供同时发生多件事情的视觉效果。几毫秒应该足以让UI反映最新的更改

当然,它也有它的缺点,如果在执行后台计算时用户可能想要执行多个操作,那么它可能很难实现。此外,它还可以大大降低整个背景计算的速度,因为它有时会延迟几毫秒。然而,在特定的情况下,它会发挥作用,并且表现良好

第二种选择是使用WebWorkers,它基本上是在后台独立运行的Javascript脚本,就像线程一样。它更容易实现,您只需担心主代码和后台工作人员之间的消息传递,这样您的整个应用程序就不会受到太多影响。你可以从Mic发布的链接中了解如何使用它们。web workers最大的缺点是浏览器支持,你可以在2009年(FF 3.5/Gecko 1.9.1)看到IE没有可能的解决方法,添加了一个新的web API,称为。它也适用于Chrome4+、Opera10.6+和IE10+

辅助线程基本上是一个在单独进程中运行的后台线程

主进程(例如用户界面的主线程)和从进程(后台线程、工作进程)之间的通信是通过一个通用的PostMessage/onmessage函数建立的,在这个函数中,您可以在双方之间交换您喜欢的任何数据

值得一提的是,每个工人都被分配到不同的核心。例如,通过在四处理器上创建4个不同的worker(执行长时间运行的计算),您将看到所有4个CPU内核,比如100%,而主脚本仍处于空闲状态,从而响应UI事件(请参阅)

一个基本的例子:

main script.js

if ("function" !== typeof window.Worker) {
  throw "Your browser doesn't support Web Workers";
}
var thread = new Worker("background-thread.js");
thread.onmessage = function(e) {
  console.log("[A] : I received a " + e.data + " :-P");
};
thread.onerror = function(e) {
  console.log(e);
};

console.log("[A] : I'm sending a PING :-)");
thread.postMessage("PING");
onmessage = function(e) {
  console.log("[B] : I receveid a " + e.data + " :-)");
  console.log("[B] : I will respond with a PONG ;-)");
  postMessage("PONG");
};
后台线程.js

if ("function" !== typeof window.Worker) {
  throw "Your browser doesn't support Web Workers";
}
var thread = new Worker("background-thread.js");
thread.onmessage = function(e) {
  console.log("[A] : I received a " + e.data + " :-P");
};
thread.onerror = function(e) {
  console.log(e);
};

console.log("[A] : I'm sending a PING :-)");
thread.postMessage("PING");
onmessage = function(e) {
  console.log("[B] : I receveid a " + e.data + " :-)");
  console.log("[B] : I will respond with a PONG ;-)");
  postMessage("PONG");
};
上述示例应在浏览器控制台上生成以下输出:

[A] :我正在发送一个PING:-)

[B] :我收到一个PING:-)

[B] :我会砰的一声回答;-)

[A] 例如我收到一声乒乓球


很高兴PING到您的背景脚本

你看过网络工作者吗?