1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關咨詢
      選擇下列產品馬上在線溝通
      服務時間:8:30-17:00
      你可能遇到了下面的問題
      關閉右側工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      HTML5多線程處理

       HTML5中我覺得最有用和激動人心的功能就是引入了線程的概念,從而我們可以用多線程的思想來處理比較復雜的應用。我們可以讓前臺線程去完成和用戶交互的工作,而把比較復雜的,耗時較長的運算放在后臺線程中完成,而讓前臺線程與后臺線程通過消息交互.(注意:后臺線程是不可以直接操作window對象和dom樹的)

      創(chuàng)新互聯(lián)公司服務項目包括章貢網(wǎng)站建設、章貢網(wǎng)站制作、章貢網(wǎng)頁制作以及章貢網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網(wǎng)行業(yè)的解決方案,章貢網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到章貢省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!

      創(chuàng)建后臺線程的核心就是HTML5 提供的 Workers API,下面是我用這個API開發(fā)一個相對比較復雜的應用。

       

      假設我們有一個需求,頁面上有一個輸入框,讓用戶輸入一個整數(shù),然后計算出所有小于這個整數(shù)的素數(shù),然后把所有的素數(shù)分別計算平方,最后吧結果顯示在主頁面上。

      如果不用HTML5,那么將會是非常長的一段JS代碼,而且如果輸入的值比較大時,它會吧整個頁面全部“凍結”,有了HTML5就輕松許多了,我們分工如下:

       

      主線程:把主頁面上的輸入框的中的數(shù)發(fā)送給后臺線程1

      后臺線程1:根據(jù)這個數(shù)來找到所有比它小的素數(shù),然后把這些素數(shù)封裝在一個JSON數(shù)組中發(fā)送給主線程,同時把這一步驟的處理時間發(fā)送給主線程

      主線程:收到后臺線程發(fā)過來的信息,然后把素數(shù)列表發(fā)給后臺線程2

      后臺線程2:對于素數(shù)列表中的每一個素數(shù),計算求出其平方,然后把所有的結果以JSON數(shù)組形式發(fā)送給主線程,同時把這一步驟的處理時間發(fā)送給主線程

      主線程:把后臺線程1,后臺線程2所得到的結果以及每個線程執(zhí)行各自所用的時間顯示在主頁面上指定id的區(qū)域內

       

      所以,我們首先要有個主頁面,用來接受用戶輸入和最終顯示結果,這個頁面代碼如下:

      1.  
      2.  
      3.  
      4.     charset="utf-8" 
      5. /> 
      6. HTML5 線程交互例子 
      7.  
      8.   
      9.  
      10.  
      11.  
      12.  
      13.     

        這個例子演示HTML5中的Worker的用法,它可以讓主線程和多個后臺線程合作來完成一項任務

         
      14.     

        步驟概述: 

      15.     

        主線程:把主頁面上的輸入框的中的數(shù)發(fā)送給后臺線程1

         
      16.     

        后臺線程1:根據(jù)這個數(shù)來找到所有比它小的素數(shù),然后把這些素數(shù)封裝在一個字符串對象中發(fā)送給主線程,同時把這一步驟的處理時間發(fā)送給主線程

         
      17.     

        主線程收到后臺線程發(fā)過來的信息,然后把素數(shù)列表發(fā)給后臺線程2

         
      18.     

        后臺線程2:對于素數(shù)列表中的每一個素數(shù),計算求出其平方,然后把所有的結果發(fā)送給主線程,同時把這一步的處理時間發(fā)送給主線程

         
      19.     

        主線程:構造html頁面,顯示出每個步驟的處理時間,以及最終顯示結果

         
      20.     
         
      21.     輸入一個正整數(shù): 
      22.      
      23.      
      24.      
      25.     

         
      26.  
      27.  
      28.  

       

       

      其次,我們來構建主線程,它主要任務就是進行協(xié)調和調度,它先取得用戶輸入,然后發(fā)送消息給后臺工作線程1,之后接收從后臺工作線程1返回的內含素數(shù)數(shù)組的消息,并把這個數(shù)組發(fā)給后臺工作線程2,再接收從后臺工作線程2中返回的內含素數(shù)平方數(shù)組的消息,最終把所有消息匯總然后打印在主頁面上,細節(jié)請看我的代碼注釋:

      mainthread.js

      1. //這個函數(shù)是頁面上點擊button的事件處理函數(shù) 
      2. function handleInputInteger(){ 
      3.      
      4. //讓window對象創(chuàng)建第一個后臺線程(worker1),這個后臺線程專門負責得到小于等于某個整數(shù)的所有素數(shù) 
      5. var worker1= new Worker("js/worker1-getPrimeList.js"); 
      6.  
      7.  
      8. //獲取用戶輸入的整數(shù)并轉為10進制 
      9. var integerInput=document.getElementById("inputedInteger").value; 
      10. var num=parseInt(integerInput,10); 
      11.  
      12. //把從用戶輸入的整數(shù)傳給后臺線程1 
      13. worker1.postMessage(num); 
      14.  
      15.  
      16. //當獲取從后臺線程1(worker1)傳遞過來的結果時,我們處理這個結果,我們這個結果是個json對象 
      17. worker1.onmessage=function(event){ 
      18.   
      19.     //取得從后臺線程1(worker1)返回的JSON對象,并且分離出信息 
      20.     //其中primeArray是由后臺線程1(worker1)完成的取得所有<=指定整數(shù)的素數(shù)構成的素數(shù)數(shù)組(還是未解析的JSON數(shù)組) 
      21.     //而worker1ElapsedTime則是后臺線程1(worker1)完成它的工作的用時,單位毫秒 
      22.     var data = event.data; 
      23.     var dataInfo=JSON.parse(data); 
      24.     var primeArray=dataInfo.primeArray; 
      25.     var worker1ElapsedTime=dataInfo.worker1ElapsedTime; 
      26.      
      27.      
      28.     //我們讓主線程創(chuàng)建第二個后臺線程(worker2),這個后臺線程可以把所有的素數(shù)計算平方 
      29.     var worker2 = new Worker("js/worker2-getSquaredPrimeList.js"); 
      30.      
      31.     //把primeArray的信息發(fā)送給第二個后臺線程(worker2) 
      32.     worker2.postMessage(primeArray); 
      33.      
      34.     //當獲得從后臺線程2(worker2)傳來的結果時,我們在主頁面上構造信息塊,反映出整個過程 
      35.     worker2.onmessage=function(event){ 
      36.          
      37.         //取得從后臺線程2(worker2)返回的JSON對象,并且分離出信息 
      38.         //primeArray是從主線程傳遞給后臺線程2(worker2)的素數(shù)數(shù)組 
      39.         //squaredPrimeArray是由后臺線程2(worker2)完成的所有的素數(shù)的平方構成的數(shù)組 
      40.         //而worker2ElapsedTime則是后臺線程2(worker2)完成它的工作的用時,單位毫秒 
      41.         var data = event.data; 
      42.         var dataInfo=JSON.parse(data); 
      43.         var primeArray=dataInfo.primeArray; 
      44.         var squaredPrimeArray=dataInfo.squaredPrimeArray; 
      45.         var worker2ElapsedTime=dataInfo.worker2ElapsedTime; 
      46.          
      47.         //取得素數(shù)的個數(shù) 
      48.         var numOfPrimes=JSON.parse(primeArray).length; 
      49.         //構造信息文本,并且顯示在頁面上id為"result"的區(qū)域 
      50.         var result=document.getElementById("result"); 
      51.         var resultStr="用戶輸入的整數(shù)為: "+num+"
        "; 
      52.         resultStr+="
        "; 
      53.         resultStr+="后臺線程1(worker1)經(jīng)過分析可知,小于該整數(shù)的素數(shù)一共有"+numOfPrimes+"個。"+"
        "; 
      54.         resultStr+="后臺線程1(worker1)得到了素數(shù)數(shù)組為:"+primeArray+"
        "; 
      55.         resultStr+="后臺線程1(worker1)的操作用時為: "+worker1ElapsedTime+"毫秒!"+"
        "; 
      56.         resultStr+="
        "; 
      57.         resultStr+="后臺線程2(worker2)得到的素數(shù)的平方數(shù)組為:"+squaredPrimeArray+"
        "; 
      58.         resultStr+="后臺線程2(worker2)的操作用時為: "+worker2ElapsedTime+"毫秒!"+"
        "; 
      59.         result.innerHTML=resultStr; 
      60.          
      61.     } 
      62.  
      63. }; 
      64.  
      65.  
      66.   

       

      再次,我們來定義后臺工作線程1(worker1),這個線程必須被包含在一個js文件中,它必須定義當接收從主線程傳來的消息(一個整數(shù))時的處理函數(shù),它會構造一個小于這個整數(shù)的所有素數(shù)組成的素數(shù)數(shù)組,并把這個素數(shù)數(shù)組返回給調用者線程(主線程)、當然了,我們還需要一個輔助方法來判斷某個整數(shù)是否為素數(shù),所以worker1-getPrimeList.js的代碼如下:

      1. //這個函數(shù)用于判斷某個數(shù)是否為素數(shù) 
      2. function isPrime(number) { 
      3.         if (number < 2) { 
      4.             return false; 
      5.         } else { 
      6.             for (var j = 2; j <= Math.sqrt(number); j++) { 
      7.                 if (number % j == 0) { 
      8.                     return false; 
      9.                 } 
      10.             } 
      11.         } 
      12.         return true; 
      13.     } 
      14.   
      15.  
      16. // 這個js代碼可以接收傳入的整數(shù)并且返回所有小于等于這個整數(shù)的素數(shù)列表 
      17. onmessage = function(event) { 
      18.      
      19.      
      20.     //計算開始時間 
      21.     var beginTime = new Date().getTime(); 
      22.      
      23.  
      24.     // 獲取用戶輸入的整數(shù) 
      25.     var num = event.data; 
      26.      
      27.  
      28.     // 構造一個buffer素數(shù)數(shù)組 
      29.     var bufferedPrimeArray = new Array(num); 
      30.  
      31.     var primeArrayMaxIndex=0; 
      32.     for (var i = 0; i < num; i++) { 
      33.         if (isPrime(i)){ 
      34.             bufferedPrimeArray[primeArrayMaxIndex]=i; 
      35.             primeArrayMaxIndex++; 
      36.         } 
      37.     } 
      38.      
      39.     //構造真正的素數(shù)數(shù)組 
      40.     var primeArray = new Array(primeArrayMaxIndex); 
      41.     //將buffer素數(shù)數(shù)組中的所有的素數(shù)移動到這個數(shù)組中 
      42.     for(var j=0;j
      43.         primeArray[j]=bufferedPrimeArray[j]; 
      44.     } 
      45.      
      46.     //計算結束時間 
      47.     var endTime= new Date().getTime(); 
      48.      
      49.     var elapsedTime=endTime-beginTime; 
      50.      
      51.      
      52.     //構造json對象來存儲信息: 
      53.     var data = new Object; 
      54.     data.primeArray = JSON.stringify(primeArray); 
      55.     data.worker1ElapsedTime= elapsedTime; 
      56.     var str=JSON.stringify(data); 
      57.      
      58.     //把這個json對象發(fā)送回主線程 (也就是創(chuàng)建這個worker1的線程) 
      59.     postMessage(str); 
      60.      
      61.      

       

      最后,我們來定義后臺工作線程2(worker2),這個線程也必須被包含在一個js文件中,它必須定義當接收從主線程傳來的消息(一個素數(shù)數(shù)組)時的處理函數(shù),它會構造一個對應的素數(shù)平方數(shù)組,并把這個素數(shù)數(shù)組,以及素數(shù)平方數(shù)組返回給調用者線程(主線程),所以worker2-getSquaredPrimeList.js的代碼如下:

      1. // 這個 js代碼可以把傳入的素數(shù)數(shù)組中每個素數(shù)依次求平方,然后構造一個素數(shù)平方數(shù)組 
      2. onmessage = function(event) { 
      3.      
      4.      
      5.     //計算開始時間 
      6.     var beginTime = new Date().getTime(); 
      7.      
      8.  
      9.     // 獲取從主線程傳來的素數(shù)數(shù)組,并且還原成真正的素數(shù)數(shù)組 
      10.     var primeArrayFromMainThread= event.data; 
      11.     var primeArray = JSON.parse(primeArrayFromMainThread); 
      12.     var length=primeArray.length; 
      13.  
      14.     //構造一個素數(shù)平方數(shù)組 
      15.     var squaredPrimeArray=new Array(length); 
      16.      
      17.     //將原來數(shù)組中的所有素數(shù)依次求平方,然后填充到這個新的平方數(shù)組中 
      18.     for (var i=0;i
      19.         squaredPrimeArray[i]=primeArray[i]* primeArray[i]; 
      20.     } 
      21.          
      22.      
      23.     //計算結束時間 
      24.     var endTime= new Date().getTime(); 
      25.      
      26.     var elapsedTime=endTime-beginTime; 
      27.      
      28.      
      29.     //構造json對象來存儲信息: 
      30.     var data = new Object; 
      31.     data.primeArray = JSON.stringify(primeArray); 
      32.     data.squaredPrimeArray=JSON.stringify(squaredPrimeArray); 
      33.     data.worker2ElapsedTime= elapsedTime; 
      34.     var str=JSON.stringify(data); 
      35.      
      36.     //把這個json對象發(fā)送回主線程 (也就是創(chuàng)建這個worker1的線程) 
      37.     postMessage(str); 
      38.      
      39.      

       

      最后國際慣例,我們演示下例子:

      首先,用戶輸入前:

      HTML5 多線程處理

      用戶輸入某個整數(shù),比如98,則顯示如下:

      HTML5 多線程處理

       


      網(wǎng)頁名稱:HTML5多線程處理
      標題鏈接:http://www.ef60e0e.cn/article/jgeioj.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        南召县| 延庆县| 杂多县| 湟中县| 宜丰县| 皮山县| 浦东新区| 大英县| 永仁县| 驻马店市| 舞阳县| 乌什县| 兴山县| 万安县| 兰考县| 无为县| 镇江市| 新巴尔虎右旗| 吉林省| 永州市| 特克斯县| 枣强县| 颍上县| 阜阳市| 徐州市| 米脂县| 腾冲县| 中西区| 五莲县| 军事| 天水市| 乐清市| 宾川县| 凤城市| 庆安县| 双鸭山市| 株洲市| 聊城市| 昌黎县| 罗田县| 凤台县|