zoukankan      html  css  js  c++  java
  • 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+"
    ";
            }
          }
          // 服务停止事件
          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);
  • 相关阅读:
    Java线程中带有返回值的线程Callable
    Android 子线程测试
    JAVA下的Thread.sleep方法一定要try
    解决Android Studio 和 Android SDK Manager 无法在线更新的问题.
    asp.net关于页面不回发,不生成__doPostBack方法问题的完美解决方案
    git 使用2
    前端vue组件传参
    微信小程序 路由跳转 异步请求 存储数据,微信登录接口
    微信小程序 基本介绍及组件
    安装虚拟机
  • 原文地址:https://www.cnblogs.com/xgao/p/4200994.html
Copyright © 2011-2022 走看看