

JavaScriptでWebWorkerを使用しています。  
私が作ったシステムではWebWorkerの値を送受信する速度が速すぎて、  
HTMLに反映される処理が追い付いていない問題が発生しています。  
そこで、sleep関数を定義することで、制御することを考えました。

[code]

    /*Sleep関数 */
    function Sleep( milii_second ){
        let start   = new Date().getTime();
        let end     = new Date().getTime();
        while( end < start + milii_second ){
            end = new Date().getTime()
        };
        return;
    }
    Sleep(40);
    
[/code]

こちらの関数はビジーウェイトと呼ばれるもので、CPUに負荷がかかるのであまり使用したくありません。しかし、WebWorker内で使用しているためか、ブラウザが止まりませんでした。止まっていることに気づいていないだけ？

[code]

    /*sleep関数(setInterval)
    function sleep(waitSec, callbackFunc){
        let spanedSec = 0;
        let id = setInterval(function () {
            spanedSec++;
            if(spanedSec >= waitSec) {
                clearInterval(id);
                if (callbackFunc) callbackFunc();
            }
        }, 40);
    }
    
    sleep(5, function () {});
    
[/code]

こちらのsleep関数を利用するとCPUに負荷はかからないので、使用したいのですが、WebWorker内で使用しても、sleep関数を入れても効果がありませんでした。使い方が間違っているかもしれません。  
私の推測で申し訳ありませんが、WebWorkerはそもそもマルチスレッドで処理されています。  
setIntervalやsetTimeoutは非同期処理であるため、利用しても、効果がないではないかと考えています。

一応、ビジーウェイトのsleep関数だと実行速度を制御させることができました。  
ほかに便利な関数あるいは改善箇所があれば、ぜひ教えていただいてもよろしいでしょうか

よろしくお願いいたします。

HTMLの描画を行うスレッド(メインスレッド)と  
メインスレッドで受け渡した値に応じた  
関数を実行する(実行スレッド)の２つに分けています


CC BY-SA 4.0
2020-10-04T10:16:02.623
70904
2020-10-06T23:54:23.760
2020-10-06T23:54:23.760
42175
42174
question
javascript web-worker
WebWorkerの実行速度を制御したい