基础知识
Web Worker是在HTML5中新增的,用来在Web应用程序中实现后台处理的一项技术。使用这个API,用户可以很容易地创建在后台运行的线程(在HTML5中称为worker),如果将可能耗费较长时间的处理交给后台去执行,对用户在前台页面中执行的操作就完全没有影响了。
创建后台线程的步骤很简单。只要在Worker类的构造器中将需要在后台线程中执行的脚本文件的URL作为参数,然后创建Worker对象就可以了,例如:
var worker = new Worker("worker.js");
注意:在后台线程中是不能访问页面或窗口对象的。 如果在后台线程的脚本文件中使用到window对象或document对象,则会引起错误的发生。
另外,可以通过发送和接收消息来与后台线程互相传递数据。通过对Worker对象的message事件句柄的获取可以在后台线程之中接收消息,使用方法如下:
worker.addEventListener("message", function(event) { // 处理接收的消息。 }, false);
使用Worker对象的postMessage()方法来对后台线程发送消息,发送的消息是文本数据,但也可以是任何JavaScript对象(需要通过JSON对象的stringify()方法将其转换成文本数据)。
worker.postMessage(message);
另外,同样可以通过获取Worker对象的message事件句柄及Worker对象的postMessage()方法在后台线程内部进行消息的接收和发送。
与线程进行数据的交互
使用后台线程时不能访问页面或窗口对象,但是并不代表后台线程不能与页面之间进行数据交互。示例中页面上随机生成一个整数数组,然后将该整数数组传入线程,挑选出数组中可以被3整除的数字,然后显示在页面的表格中,主页面代码如下:
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"/> <title>与线程进行数据交互</title> <script type="text/javascript" src="http://code.jquery.com/jquery-1.6.4.min.js"></script> <script type="text/javascript"> $(function() { var intArray = new Array(100); for(var index = 0; index < intArray.length; index++) { intArray[index] = parseInt(Math.random() * 100); } var worker = new Worker("sumWorker.js"); worker.postMessage(JSON.stringify(intArray)); worker.addEventListener("message", function(event) { if(event.data != "") { var array = JSON.parse(event.data); var row, col; for(var index = 0; index < array.length; index++) { row = parseInt(index / 10); col = index % 10; if(col == 0) { $("<tr>").appendTo("tbody"); } $("<td>").text(array[row * 10 + col]).appendTo("tbody tr:last"); } } }, false); }); </script> </head> <body> <table> <caption>从随机生成的数字中抽取3的倍数并显示</caption> <tbody></tbody> </table> </body> </html>
示例中使用的线程脚本代码如下:
self.addEventListener("message", function(event) { var data = JSON.parse(event.data); var returnArray = new Array(); var temp; for(var index = 0; index < data.length; index++) { if((temp = data[index]) % 3 == 0) { returnArray.push(temp); } } self.postMessage(JSON.stringify(returnArray)); }, false);
线程嵌套
线程中可以嵌套子线程,这样我们可以把一个较大的后台线程切分成几个子线程,在每个子线程中各自完成相对独立的一部分工作。
单层嵌套
修改上例中的主页面script元素中的JavaScript代码如下:
$(function() { var worker = new Worker("randomWorker.js"); worker.postMessage(""); worker.addEventListener("message", function(event) { if(event.data != "") { var array = JSON.parse(event.data); var row, col; for(var index = 0; index < array.length; index++) { row = parseInt(index / 10); col = index % 10; if(col == 0) { $("<tr>").appendTo("tbody"); } $("<td>").text(array[row * 10 + col]).appendTo("tbody tr:last"); } } }, false); });
其中“randomWorker.js” 脚本文本代码如下:
self.addEventListener("message", function(event) { var intArray = new Array(100); for(var index = 0; index < intArray.length; index++) { intArray[index] = parseInt(Math.random() * 100); } var worker = new Worker("sumWorker.js"); // 把随机数组传递给子线程进行挑选工作。 worker.postMessage(JSON.stringify(intArray)); worker.addEventListener("message", function(event1) { self.postMessage(event1.data); // 把挑选结果返回主页面。 }, false); }, false);
注意:在线程,向子线程提交消息时使用子线程对象的postMessage()方法,而向本线程的创建源发送消息时使用self.postMessage()方法。 在本线程中创建的挑选线程“sumWorker.js”脚本代码如下:
self.addEventListener("message", function(event) { var data = JSON.parse(event.data); var returnArray = new Array(); var temp; for(var index = 0; index < data.length; index++) { if((temp = data[index]) % 3 == 0) { returnArray.push(temp); } } self.postMessage(JSON.stringify(returnArray)); self.close(); // 关闭子线程。 }, false);
注意:在子线程中向发送源发送回消息后,如果该子线程不再使用,则可以使用self.close()方法关闭该子线程。
多层嵌套
要实现子线程与子线程之间的数据交互,其基本步骤如下:
- 先创建发送数据的子线程。
- 执行子线程中的任务,然后把要传递的数据发送给主线程。
- 在主线程接收到子线程传回来的消息时,创建接收数据的子线程,然后再把发送数据的子线程中返回的消息传递给接收数据的子线程。
- 执行接收数据子线程中的代码。
线程中可用的变量、函数与类
- self:用来表示本线程范围内的作用域。
- postMessage(msg):向创建线程的源窗口发送消息。
- onmessage:获取接收消息的事件句柄。
- importScripts(urls):导入其它JavaScript脚本文件。参数为该脚本文件的URL地址,可以导入多个脚本文件,导入的脚本文件必须与使用该线程文件的页面在同一个域中,并在同一个端口中。
- navigator对象:与window.navigator对象类似,具有appName、platform、userAgent、appVersion等属性。
- sessionStorage、localStorage:可以在线程中使用Web Storage。
- XMLHttpRequest:可以在线程中处理Ajax请求。
- Web Workers:可以在线程中嵌套线程。
- setTimeout()、setInterval():可以在线程中实现定时处理。
- close():结束本线程。
- eval()、isNaN()、escape()等:可以使用所有JavaScript核心函数。
- object:可以创建和使用本地对象。
- WebSockets:可以使用WebSockets API来向服务器发送和接收信息。
发表评论
-
使用选择器在页面中插入内容
2011-11-08 10:09 0使用选择器来插入文字 使用选择器来插入内容 在CSS2中, ... -
HTML5 绘制图形【4】
2011-11-08 08:39 1717绘制变形图形 坐标变换 绘制图形的时候,我们可能会想要旋转 ... -
CSS3 选择器【2】
2011-11-07 14:30 1143UI元素状态伪类选择器 UI元素状态伪类选择器的共同特征是: ... -
HTML5 绘制图形【3】
2011-11-05 19:28 1339绘制渐变图形 渐变是指在填充时从一种颜色慢慢过渡到另外一种颜 ... -
CSS3 选择器【1】
2011-11-06 12:19 1760选择器概述 选择器是CS ... -
HTML5 绘制图形【2】
2011-11-04 11:42 1451使用路径 绘制圆形 要 ... -
HTML5 绘制图形【1】
2011-11-03 12:48 1565canvas元素基础 canvas元素是HTML5中新增的一 ... -
CSS3 模块化结构
2011-11-03 19:12 1552CSS3中的模块 模块名称 功能描述 Basi ... -
HTML5 获取地理位置信息
2011-11-01 18:12 5450Geolocation API的基本知识 在HTML5中,为 ... -
HTML5 Web Sockets通信
2011-10-29 20:15 4180基础介绍 Web Sockets是HTML5提供的在Web应 ... -
HTML5 跨文档消息传输
2011-10-29 19:11 2057基本介绍 HTML5提供了在网页文档之间互相接收与发送信息的 ... -
HTML5 离线应用程序【2】
2011-10-27 20:48 1902applicationCache对象 application ... -
HTML5 离线应用程序【1】
2011-10-27 14:02 1611离线Web应用程序介绍 在HTML5中新增了一个API,为离 ... -
HTML5 本地数据库
2011-10-24 21:03 2630本地数据库的基本概念 ... -
HTML5 Web Storage
2011-10-24 15:51 1649Web Storage简单使用 在HTML5中重新提供了一种 ... -
HTML5 多媒体播放【3】
2011-10-23 10:45 1256video元素和audio元素的方法 play()方法:使 ... -
HTML5 多媒体播放【2】
2011-10-22 21:14 1755音频和视频元素的属性 这两种元素所具有的属性大致相同,介绍如 ... -
HTML5 多媒体播放【1】
2011-10-21 18:58 976video与audio元素基础 在HTML5中,video元 ... -
HTML5 拖放API
2011-10-17 19:43 4979在HTML5中,已经支持在浏览器与其他应用程序之间的数据互相拖 ... -
HTML5 文件API
2011-10-16 18:49 5062在HTML5中,提供了一个关于文件操作的文件API,通过使用这 ...
相关推荐
太赫兹金属回形结构:电磁波调控与信号传输的关键技术,太赫兹金属回形结构。 ,太赫兹; 金属; 回形结构; 电磁波响应,太赫兹金属回形结构:高效电磁波调控技术
路翼DCS460电脑调音软件下载是专为汽车音响爱好者和专业人士设计的一款强大工具, 这款软件的主要功能在于帮助用户对车载音频系统进行精确的数字信号处理,以提升音乐播放效果,提供更丰富的听觉体验。
基于Matlab的轴承故障分类系统:小波包能量特征提取与深度置信网络(DBN)的分类模型研究与应用,基于小波包能量特征提取和深度置信网络(DBN)的轴承故障分类 开发语言matlab 程序内容包括 1.轴承故障数据一份,共10类 2.数据读取,训练集,测试集数据划分。 3.小波包特征能量特征提取程序一份 4.基于DBN故障分类模型一份 ,小波包能量特征提取;DBN故障分类模型;Matlab;轴承故障数据;数据划分,基于MATLAB的轴承故障分类:小波包能量特征提取与深度置信网络分类模型
matlab实现PSO-BP分类完整程序+数据
基于AHP-CRITIC组合变权与指标劣化度修正的赋权方法研究,38考虑劣化度APH-CRITIC组合变权 组合变权赋权方法,基于AHP和改进CRITIC计算主客观权重,引入指标劣化度构造变权函数对综合权重进行修正,还方法可以捕捉指标时序的劣化程度,实现数据的有效跟踪,评价更加合理。 可根据需求进行改进。 ,关键词:组合变权赋权方法;AHP;CRITIC;指标劣化度;变权函数;时序劣化程度;数据跟踪;评价合理。,基于AHP-CRITIC组合变权法:综合主客观权重与指标劣化度评价
ROS机械臂仿真与视觉抓取技术:Darknet_ROS配置及Matlab运动学轨迹规划研究,ros机械臂仿真代做,视觉抓取,darknet_ros配置 Matlab机械臂运动学,轨迹规划 ,ROS机械臂仿真; 视觉抓取; darknet_ros配置; Matlab机械臂运动学; 轨迹规划,ROS机械臂仿真与视觉抓取:Darknet_ROS配置及Matlab运动学轨迹规划
农村事务管理与交流平台 免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1jKDjYrEz1 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
"基于Rsoft的光纤拉锥与弯曲模型仿真研究:探究beamprop模块的应用",光纤弯曲、拉锥弯曲模型仿真 Rsoft光学仿真,beamprop模块 ,光纤弯曲; 拉锥弯曲模型仿真; Rsoft光学仿真; beamprop模块,Rsoft仿真:光纤拉锥与弯曲的光束传播模型研究
亚像素提取的精确利器:Bresenham算法与卡尺算法的融合应用,bresenham算法,用于亚像素提取,卡尺算法 ,Bresenham算法; 亚像素提取; 卡尺算法,"Bresenham算法:亚像素提取的精准工具"
基于Vivado HLS的CLAHE算法FPGA实现:高效率视频处理IP核工程,限制对比度的自适应直方图均衡算法(CLAHE)的FPGA实现。 可实时处理视频流。 算法具体内容不做过多介绍,网上都有。 使用vivado hls实现,生成的IP核的输入输出接口都为axi-stream。 已经上板跑通(zynq7020)。 摄像头分辨率400*400-30fps,可以轻松的做到实时处理。 (如果您不清楚我的源码是否能应用到您的项目中,可以发我硬件平台和要处理视频流的分辨率与帧率,帮你评估。 )此hls源码工程。 ,关键词: 1. 限制对比度的自适应直方图均衡算法(CLAHE) 2. FPGA实现 3. 实时处理视频流 4. Vivado HLS 5. AXI-Stream接口 6. Zynq7020平台 7. 摄像头分辨率与帧率 8. HLS源码工程,基于Vivado HLS的CLAHE算法FPGA实现:实时视频流处理工程
games101-作业3
"基于Halcon的C#可视化工具:轻松抓边抓圆,Halcon控件上绘制更简单",使用C#新研发的基于Halcon的可视化抓边、抓圆工具,在Halcon控件上绘制的,使用起来简单 ,使用C#研发;Halcon可视化抓边工具;Halcon抓圆工具;在Halcon控件上绘制;简单易用;快速使用;直接绘制,"C#研发的Halcon可视化工具:抓边抓圆,简单易用"
基于微信小程序的校园食堂订餐服务系统 免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1jKDjYrEz1 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
"COMSOL PDE中设置Floquet周期性边界条件的步骤与注意事项",comsol pde设置floqeut周期性边界条件 ,comsol; pde设置; floqeut; 周期性边界条件,COMSOL PDE设置周期性边界条件
计算机网络第八版课件资料
基于FLAC3D的复杂地质环境下的双线隧道与基坑协同开挖策略:分步开挖,多层防护处理,flac3d 双线隧道开挖和基坑开挖。 临近既有隧道基坑开挖。 首先进行隧道开挖,考虑应力释放,使用反力支撑法,使用shell壳单元支护。 然后进行基坑开挖,使用地连墙和对撑支护。 分三层开挖。 ,flac3d;双线隧道开挖;基坑开挖;应力释放;反力支撑法;shell壳单元支护;分三层开挖;地连墙;对撑支护。,FLAC3D:隧道基坑双线开挖与支护技术
4b076399e3f709dc8990bd0e12720254.part6
西门子S7-200PLC与组态王技术在温室大棚系统中的应用与实现,38#西门子S7-200PLC和组态王温室大棚系统 ,38号项目; 西门子S7-200PLC; 组态王; 温室大棚系统; 控制系统,西门子S7-200PLC与组态王联控温室大棚系统
"深度探讨:对称修正梯形加速度规律插补算法的推导与仿真实践",对称修正梯形加速度规律插补算法推导仿真 ,对称修正; 梯形加速度; 插补算法; 推导; 仿真,对称梯形加速度插补算法推导仿真
"基于MATLAB GUI界面的多步骤裂缝检测系统:去除阴影,滤噪处理,图像增强与骨架特征提取技术",- 标题: 基于matlab的裂缝检测系统 - 关键词:matlab GUI界面 数字图像处理 去除阴影 滤波 图像增强 大津算法 otsu zhang_suen算法 形态学操作 骨架特征提取 中轴变化 - 步骤:打开图像 去除阴影 滤波操作 图像增强 阈值处理 形态学操作 骨架提取 - 简述:使用数字图像处理技术对输入图像去阴影操作,并可选择使用:中值滤波,均值滤波, 高斯滤波三种算法,之后再对图像进行增强操作,阈值化的大津算法,以及对阈值处理后的图像进行形态学操作,最终使用zhang_suen算法或者中轴变化算法,骨架效果提取明显,能保持裂缝的总体结构不变化且连续。 ,基于matlab的裂缝检测系统;matlab GUI界面;数字图像处理;去除阴影;滤波(中值滤波、均值滤波、高斯滤波);图像增强;大津算法;形态学操作;zhang_suen算法;骨架特征提取;中轴变化。,基于Matlab GUI的裂缝检测系统:数字图像处理与阴影去除技术