如何在JavaScript中实现多线程?
我的网站允许用户记录画布,同时在画布上画画。如果用户开始记录画布,并开始在画布上绘制画布上的图形,则画布上的图形将开始滞后。我听说多线程web工作人员应该能够解决这个问题。然而,我不知道该如何开始 有人能给我引路吗?我应该在postmessage/onmessage中放什么如何在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
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函数 页面
- 对某些对象(如窗口、文档和父对象)的访问受到限制
希望它对您有用javaScript是单线程的。每个窗口只有一个javascript线程,通常称为浏览器UI线程(“线程”不一定对所有浏览器都准确) 问题: ajax、setTimeout等异步事件是如何发生的 浏览器附带一个称为事件循环的内部循环,它检查队列和进程并执行它。因此,它们仅在执行过程中有开口时运行。我可以写一篇很长的文章来说明这是如何工作的,但这是断章取义的 那么解决方案是什么?网络工作者? 是的,它可以完成多线程的一些功能。但它也有局限性
- 它无法访问DOM
- 他们无法访问main中的全局变量或js函数 页面
- 对某些对象(如窗口、文档和父对象)的访问受到限制
希望它对您有用Web工作者无法访问dom,这可能是您用例的一个限制。你仍然可以使用