2016-11-03 2 views
0

ich auf diesem Code gerade arbeite:JS - Wie funktioniert Web Workers?

JS

<script src='file://C:\blablabla\JavaScript\bignumber.js-master\bignumber.js'></script> 
<script> 
    document.write("<h1>\"blabla\"</h1>\n<h3>blabla</h3>"); 

    function problem(){ 
     var img = document.getElementById('problemi'); 
     return img.style.display = img.style.display === 'block' ? 'none' : 'block'; 
    } 

    function problem551(){ 
     problem(); 
     var t0 = performance.now(); 
     var max = 1e+15; 
     var sum = new BigNumber(1); 
     for(var i=1;i<max;i++) 
      sum = sum.plus(scomponi(sum,0)); 
     var t1 = performance.now(); 
     document.getElementById("p551").innerHTML = 'blabla<span>'+max+"</span> blabla <span>" + sum +"</span> in <span>"+(t1 - t0)/1000+"</span> blaaa"; 

    } 

    function scomponi(num,sum){ 
     var str=num.toString(); 
     for(var i = 0 ; i< str.length ;i++){ 
      sum += parseInt(str[i]); 
     } 
     return sum; 
    } 


</script> 

HTML

<body> 
    <div> 
     <button onclick="problem551()" >PROBLEM 551</button> 
     <img id="problemi" src="PROBLEM551.png" style="display: none;"> 
     <p id="p551"></p> 
    </div> 
</body> 

Aber Chrome stürzt, gibt es mir diese:

error

Wie kann ich diesen Fehler bei meiner Funktion verhindern, er hat eine Schleife von 1 bis 1e + 15, es dauert also zu viel Zeit. Ich habe etwas über WEBARBEITER gelesen, ist aber für mich nicht angemeldet. Ich möchte es auf meine Funktion verwenden problem551(), so kann mir jemand erklären, wie es funktioniert?

+0

Web-Mitarbeiter werden für ressourcenintensive Aufgaben empfohlen, nicht unbedingt für langwierige Aufgaben. Zuerst sollten Sie sehen, ob Sie die Leistung Ihres vorhandenen Codes verbessern können. https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers –

+0

In diesem Fall 'var myWorker = new Worker (" worker.js ");' wenn ich meine Funktion isteand verwenden möchte von worker.js? – Teshtek

+0

Was genau versuchen Sie dort? – Cerbrus

Antwort

0

Ihre Funktionen in einer neuen Datei verschieben, funcs.js:

Und new Worker("funcs.js") es zu starten verwenden.

Sie postMessage verwenden können, das Ergebnis wieder in MDN wie beschrieben zu senden:

Senden von Nachrichten an und von einem engagierten Arbeiter

Die Magie der Arbeiter über die postmessage() -Methode geschieht und die OnMessage-Ereignishandler. Wenn Sie eine Nachricht an den Arbeiter senden möchten, können Sie Nachrichten posten, um es wie folgt aus (main.js):

first.onchange = function() { 
    myWorker.postMessage([first.value,second.value]); 
    console.log('Message posted to worker'); 
} 

second.onchange = function() { 
    myWorker.postMessage([first.value,second.value]); 
    console.log('Message posted to worker'); 
} 

Hier haben wir also zwei durch die Variablen dargestellten Elemente ersten und zweiten; Wenn der Wert von beiden geändert wird, wird myWorker.postMessage ([first.value, second.value]) verwendet, um den Wert innerhalb des Workers als Array zu senden. Sie können so ziemlich alles senden in der Nachricht, die Sie mögen.

In den Arbeiter, können wir reagieren, wenn die Nachricht durch das Schreiben ein Event-Handler-Block wie folgt aus (worker.js) empfangen wird:

onmessage = function(e) { 
    console.log('Message received from main script'); 
    var workerResult = 'Result: ' + (e.data[0] * e.data[1]); 
    console.log('Posting message back to main script'); 
    postMessage(workerResult); 
} 

Sie erwarten, dass es nach wie vor nehmen viel Zeit Es ist ein ziemlich langer Vorgang, aber es wird hoffentlich verhindern, dass Chrome den Fehler anzeigt.


Ich sehe Sie versuchen Projekt Euler Problem 551.

Du Wegwerfen eine wertvolle Information zu lösen:

Sie sind gegeben A_10^6 = 31054319.

Sie müssen Ihre Iterationen nicht von 1 aus beginnen. Die nächste Zahl kann eine beliebige Zahl in der Sequenz enthalten.

a_10^6 = 31054319 

a_(10^6 + 1) = 31054319 + 3 + 1 + 0 + 5 + 4 + 3 + 1 + 9 
+0

ich Versteh nicht deinen letzten Teil, was meinst du? sum + = scompose (sum) ist nicht das gleiche? Ok ich kann mit i = 31054319 anfangen, aber es dauert 1 Sek. um diese Zahl mit i = 0 zu erreichen. – Teshtek

+0

@Teshtek Mein Schlechter, ich dachte es würde eine ganze Weile dauern berechnen. http://eulersolutions.fr.yuku.com/topic/404/PE551 ist ein interessanter Thread. –

Verwandte Themen