Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/90.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中实现多线程?_Javascript_Html_Multithreading_Canvas - Fatal编程技术网

如何在JavaScript中实现多线程?

如何在JavaScript中实现多线程?,javascript,html,multithreading,canvas,Javascript,Html,Multithreading,Canvas,我的网站允许用户记录画布,同时在画布上画画。如果用户开始记录画布,并开始在画布上绘制画布上的图形,则画布上的图形将开始滞后。我听说多线程web工作人员应该能够解决这个问题。然而,我不知道该如何开始 有人能给我引路吗?我应该在postmessage/onmessage中放什么 var recordUrl; var audioUrl; var audioStream; var audiorecorder; var elementToShare = document.getElementById("e

我的网站允许用户记录画布,同时在画布上画画。如果用户开始记录画布,并开始在画布上绘制画布上的图形,则画布上的图形将开始滞后。我听说多线程web工作人员应该能够解决这个问题。然而,我不知道该如何开始

有人能给我引路吗?我应该在postmessage/onmessage中放什么

var recordUrl;
var audioUrl;
var audioStream;
var audiorecorder;
var elementToShare = document.getElementById("elementToShare");
var recorder = RecordRTC(elementToShare, {
    type: 'canvas'
});

document.getElementById('start').onclick = function() {

    /*
    <script id="worker" type="javascript/worker">

    <!--M KY -->
        multithreading
        var blob = new Blob([document.getElementById('worker').textContent]);
        var worker = new Worker(window.webkitURL.revokeObjectURL(blob));
        URL.revokeObjectURL(blob);
        return worker;

        worker.onmessage = function(event) {

        }

        worker.postnmessage = function(event) {

        }
        */
    $('#record').trigger('click');

    if (!audioStream)
        navigator.getUserMedia(audioConstraints, function(stream) {
            if (window.IsChrome) stream = new window.MediaStream(stream.getAudioTracks());
            audioStream = stream;

            // "audio" is a default type
            audiorecorder = window.RecordRTC(stream, {
                type: 'audio',
                bufferSize: typeof params.bufferSize == 'undefined' ? 16384 : params.bufferSize,
                sampleRate: typeof params.sampleRate == 'undefined' ? 44100 : params.sampleRate,
                leftChannel: params.leftChannel || false,
                disableLogs: params.disableLogs || false
            });
            audiorecorder.startRecording();
        }, function() {});
    else {
        audio.src = URL.createObjectURL(audioStream);
        audio.muted = true;
        audio.play();
        if (audiorecorder) audiorecorder.startRecording();
    }

    window.isAudio = true;

    recorder.startRecording();
    document.getElementById('start').disabled = true;
    setTimeout(function() {
        document.getElementById('stop').disabled = false;
    }, 1000);
//worker.terminate();
// }
};
var-recordUrl;
var-audioUrl;
音频流;
无功音频记录器;
var elementToShare=document.getElementById(“elementToShare”);
var记录器=RecordRTC(elementToShare{
键入:“画布”
});
document.getElementById('start')。onclick=function(){
/*
多线程
var blob=new blob([document.getElementById('worker').textContent]);
var-worker=new-worker(window.webkitURL.revokeObjectURL(blob));
revokeObjectURL(blob);
返乡工人;
worker.onmessage=函数(事件){
}
worker.postnmessage=函数(事件){
}
*/
$(“#记录”).trigger('click');
如果(!音频流)
getUserMedia(音频约束,函数(流){
if(window.IsChrome)stream=new window.MediaStream(stream.getAudioTracks());
音频流=音频流;
//“音频”是默认类型
录音机=window.RecordRTC(流{
键入:“音频”,
bufferSize:typeof params.bufferSize==“未定义”?16384:params.bufferSize,
sampleRate:typeof params.sampleRate==“未定义”?44100:params.sampleRate,
leftChannel:params.leftChannel | | false,
disableLogs:params.disableLogs | | false
});
录音机。开始录音();
},函数(){});
否则{
audio.src=URL.createObjectURL(audioStream);
audio.muted=true;
音频播放();
if(录音机)录音机。开始录制();
}
window.isAudio=true;
记录器。开始记录();
document.getElementById('start').disabled=true;
setTimeout(函数(){
document.getElementById('stop')。disabled=false;
}, 1000);
//worker.terminate();
// }
};
画布代码

<div id="cover">
                                <!-- <canvas id="fakecanvas" width="890" height="1267" style="z-index: 2; position: absolute;left:18%"></canvas> -->
                                <canvas id="canvas" width="890" height="1267" style="z-index: 1; border:1px solid black; position: absolute;"></canvas>
                            </div>                          
                        </div>
                    </section>                  
                    <section id="section-2">
                        <div style="width: 100%; height:5%; float:left;">
                        <a id="capture2" onclick="capFunction2();">
                            <input type="image" name="screenshot2" value="Save This Page" style="float: right; width:25px; height:25px;" src="img/camera.png">
                        </a>
                        <script>
                        function downloadCanvas2(link, canvasId, filename) {
                            html2canvas([document.getElementById(canvasId)], {
                                onrendered: function(cvs2) {
                                    //var canvasData = cvs2.toDataURL('image/png');
                                    var link = document.createElement("a");
                                    link.href = cvs2.toDataURL();
                                    link.download = filename;
                                    link.click();
                                }
                            });
                        }

                        document.getElementById('capture2').addEventListener('click', function() {
                            var currentTime2 = new Date().YYYYMMDDHHMMSS();
                            downloadCanvas2(this, 'viewer2', currentTime2 + '.jpg');    
                            }, false);
                        </script>

函数downloadCanvas2(链接、canvasId、文件名){
html2canvas([document.getElementById(canvasId)]{
onrendered:function(cvs2){
//var canvasData=cvs2.toDataURL('image/png');
var link=document.createElement(“a”);
link.href=cvs2.toDataURL();
link.download=文件名;
link.click();
}
});
}
document.getElementById('capture2')。addEventListener('click',function(){
var currentTime2=新日期().YYYYMMDDHHMMSS();
下载canvas2(这是'viewer2',currentTime2+'.jpg');
},假);

javaScript是单线程的。每个窗口只有一个javascript线程,通常称为浏览器UI线程(“线程”不一定对所有浏览器都准确)

问题:

ajax、setTimeout等异步事件是如何发生的

浏览器附带一个称为事件循环的内部循环,它检查队列和进程并执行它。因此,它们仅在执行过程中有开口时运行。我可以写一篇很长的文章来说明这是如何工作的,但这是断章取义的

那么解决方案是什么?网络工作者?

是的,它可以完成多线程的一些功能。但它也有局限性

  • 它无法访问DOM

  • 他们无法访问main中的全局变量或js函数 页面

  • 对某些对象(如窗口、文档和父对象)的访问受到限制

因此,即使您希望实现web workers的多线程处理,也可能需要修改代码,使其成为事件驱动编程,而不是数据驱动编程


希望它对您有用

javaScript是单线程的。每个窗口只有一个javascript线程,通常称为浏览器UI线程(“线程”不一定对所有浏览器都准确)

问题:

ajax、setTimeout等异步事件是如何发生的

浏览器附带一个称为事件循环的内部循环,它检查队列和进程并执行它。因此,它们仅在执行过程中有开口时运行。我可以写一篇很长的文章来说明这是如何工作的,但这是断章取义的

那么解决方案是什么?网络工作者?

是的,它可以完成多线程的一些功能。但它也有局限性

  • 它无法访问DOM

  • 他们无法访问main中的全局变量或js函数 页面

  • 对某些对象(如窗口、文档和父对象)的访问受到限制

因此,即使您希望实现web workers的多线程处理,也可能需要修改代码,使其成为事件驱动编程,而不是数据驱动编程


希望它对您有用

Web工作者无法访问dom,这可能是您用例的一个限制。你仍然可以使用