当前位置: 首页 > news >正文

HTML5之 WebWorkers

为了进行后台计算提供的完全隔离计算方式
不可访问 DOM APIs
不可访问 window object
不可访问 document object
强隔离保证并行计算结果无误(无锁机制)

---- 启动

定义Worker对象
var w = new Worker("calc.js");
Worker会占用比非Worker模式更多内存
硬件好,效率高

---- 通信

Message事件用于和调用方通信
addEventListener('message',function(evt){});

postMessage()用于向Worker发消息
w.postMessage(imgData);

数据会被格式化成为JSON格式
每次发送都是源对象的copy,对象大,性能降低明显

---- Worker 可访问接口

SetTimeout()/clearTimeout()
setInterval()/clearInterval()
importScripts()引入其它JS文件
可以读取url
可以发送xmlhttprequest
Shared worker 共享数据

---- 算闰年的示例

1. HTML 设计

<form name="stepForm">
    选择速度:
    <select name="step">
    <option value="1">1 sec</option>
    <option selected="" value="10">10 sec</option>
    <option value="60">1 min</option>
    <option value="120">2 min</option>
    </select>

    <p>Jahr-Monat: <span id="y">0</span></p>
    <input id="start" type="button" onclick="startCalc();" value="Start"> 
    <input id="stop" type="button" onclick="stopCalc();" value="Stop"> 
      <pre id="cnt"></pre>
   </form>

2. JS的 设计

window.onload = function() {
    var opts = document.forms.stepForm.step.options;
    // 开始事件
    startCalc = function() {
      var step = opts[opts.selectedIndex].value;
      var w = new Worker('date_worker.js');    // 创建 Worker 对象
      // 发数据到woker
      w.postMessage(step);
      $("start").disabled = 'disabled';

      // 返回数据触发事件
      w.onmessage = function(evt) {
        if (evt.data.substr(0,2) == "y ") {
          $("y").innerHTML = evt.data.substr(2);
        } else {
          $("cnt").innerHTML += "Schaltjahr: "+evt.data+"\n";
        }
      }
      // 服务停止事件
      stopCalc = function() {
        w.terminate();    // 中断连接
        $("start").removeAttribute("disabled");
      }
    }
}

3. date_worker.js 设计

addEventListener('message', function(evt) {
  var today = new Date();
  var oldMonth = -1;
  // evt.data 即传进来的参数
  for (var i=0; i<today; i+=Number(evt.data)*1000) {
    var d = new Date(i);
    if (d.getDate() == 29 && d.getMonth() == 1 
      && d.getHours() == 12 && d.getMinutes() == 0) {
      // 返回数据
      postMessage(d.toLocaleString());
    }
    if (d.getMonth() != oldMonth) {
      // 返回数据
      postMessage("y "+d.getFullYear()+"-" +(d.getMonth()+1));
      oldMonth = d.getMonth();
    }
  }
}, false);

 

转载于:https://www.cnblogs.com/xgao/p/4200994.html

相关文章:

  • 中国科学院大学2011年数学分析高等代数考研试题
  • SOHO和BYOD网络实践记录
  • 计算机视觉数据集(不完全)
  • RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本━新增岗位管理-WinForm部分...
  • eclipse编码格式设置教程、如何为eclipse设置编码格式?
  • 【转】NGUI研究院之自适应屏幕(十)
  • 团队代码中Bug太多怎么办?怎样稳步提高团队的代码质量
  • jquery控制按钮的禁用与启用
  • 输出100000以内的质数 (优化2)
  • 莫名其妙ng-change被触发两次
  • javascript2
  • jhipster 安装
  • 2015真正运维自动化技术沙龙活动
  • python 面向对象
  • Xcode中iPhone iPad模拟器调整大小的方法
  • Angular 响应式表单之下拉框
  • avalon2.2的VM生成过程
  • conda常用的命令
  • ES2017异步函数现已正式可用
  • Hibernate最全面试题
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • js中的正则表达式入门
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • React 快速上手 - 07 前端路由 react-router
  • React-flux杂记
  • Ruby 2.x 源代码分析:扩展 概述
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 给新手的新浪微博 SDK 集成教程【一】
  • 技术:超级实用的电脑小技巧
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 小程序01:wepy框架整合iview webapp UI
  • 用mpvue开发微信小程序
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (LeetCode 49)Anagrams
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • .Net - 类的介绍
  • .NET 5种线程安全集合
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Micro Framework初体验
  • .NET Project Open Day(2011.11.13)
  • .NetCore部署微服务(二)
  • .NET单元测试
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • :“Failed to access IIS metabase”解决方法
  • @RequestBody与@ResponseBody的使用
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)