• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Ablauf queue von JS

xorg1990

New member
Hi, habe mal eine wichtige Frage die bestimmt viele interessiert.

Was passiert eigentlich wenn ich eine function aufrufe und in dieser eine Schleife habe und die function erneut aufrufe bevor die schleife zu ende ist.

z.B.:
Code:
var array = []
function process(){
  var i=0;
 for(;i<1000<i++){
  bufferxyz[i]
}
array.push(bufferxyz)
}

Wird in disem Fall array.push noch aufgerufen oder was passiert?? Oder gibt es da ein ablauf queue wo alle Funktion aufgestellt werden bis sie zu ende sind?

wenn array.push nicht aufgerufen wird wie kann man das dann lösen? Mit new process? Aber wie lösche ich das erzeugt Object dann wider?

Brauch ich am ende eine return? Ich habe ja in disem Fall nix zu return'en.

Fragen über Fragen.
 
Was passiert eigentlich wenn ich eine function aufrufe und in dieser eine Schleife habe und die function erneut aufrufe bevor die schleife zu ende ist.
es kommt zu einem laufzeitfehler wegen der endlosrekursion
das machst du aber nicht in deinem bsp.

Wird in disem Fall array.push noch aufgerufen oder was passiert??
wenn bufferxyz eigentlich process() heißen sollte nicht
 
tsseh schrieb:
wenn bufferxyz eigentlich process() heißen sollte nicht


Nee eigentlich nicht bufferxyz wird an process übergeben hatte ich vergessen.

Code:
var array = []
function process(bufferxyz){
  var i=0;
 for(;i<1000<i++){
  bufferxyz[i] *= sine[i]
}
array.push(bufferxyz)
}

process wird von onaudioprocess gefeuert aber nicht so
onoadioproces = process;
sondern
Code:
onaudioprocess = fucktion(e){
if(decoding){
   if(ii>RXBuffer.length){
    process(RXBuffer);
 }
}
}

process macht bei mir einiges.
Zum einen wird ein BufferSourceNode erzeugt , ein Scriptprocessor erzeugt und ein oszillator erzeugt und ein ChannelMergerNode erzeugt.

Das alles wird mit einander verbunden, dann wird demoduliert. Wenn die Demodulation dann fertig ist wird ein wav BLOB erzeugt und ein AudioTag damit man sich das dann anhören kann.
Ist das Audio tag erzeugt wird der ganze Salat wider disconnected und auf null gestellt.
Funktion process ist damit durch.

Ehe das alles geschehen ist können aber schon wider neue Daten kommen was dann?

Das ganze muss in einer separaten Funktion stehen da ich BufferSourceNode.start() nur einmal aufrufen kann.

RXBuffer hat eine fixe länge, aber es kann sein das nicht bis zum ende Daten hinein geschrieben werden.

Wenn also der Scriptprocessor der in process() steckt nur noch Nullen findet wird, an der stelle die Demodulation beendet und das Audio Tag erzeugt.

Habe für die Demodulation an WebWorker gedacht aber ich weiß nicht ob ich die Web audio api in workern einsetzen kann.
 
Nein du Verstehst nicht.

Es sind 2 Scriptprocessor'en auf der Seite.

Scriptprocessor A horcht auf den line-in, dass durchweg.
Wenn in Scriptprocessor A festgestellt wird "es komme daten (Daten die zuvor durch den Görtzel erkannt wurden)" wird process() gefeuert.

in process() ist Scriptprocessor B enthalten der dort Demoduliert. Wenn die Demodulation Fertig ist wird alles disconnect und vom speicher gelöscht (null).


Wenn nun aber Scriptprocessor A eher feuert als Scriptprocessor B fertig ist, was dann??
Wird Scriptprocessor B Überschrieben? Oder stapelt JS die Funktionsaufrufe bis zum Return?

Praktisch wie bein einem HTTP request auf einem Server.

- - - Aktualisiert - - -

Jetzt weiß ich was Du mit einem Laufzeitfehler meintest:frog:

Code:
<!DOCTYPE html>
<html>
<head>
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
	<title>schnell_test</title>
	<script type="text/javascript">
		function run(){
			function schnell(){
				console.log("go")
				var max = Math.pow(2,32);
				while(max--){ }
				console.log(max);
			}
			setInterval(function(){
				schnell();
			}, 0);
		}

	</script>
	</head>
	<body onload="run()">
	</body>
	</html>

Wie löst man so ein Problem in der Regel????
 
Zuletzt bearbeitet:
Es sind 2 Scriptprocessor'en auf der Seite.
ganz egal, js hat nur 1 thread (muss ich jedesmal dazuschreiben webworker mal außen vor?). dort wird immer ein eventhandler nach dem nächsten abgearbeitet.

Wenn nun aber Scriptprocessor A eher feuert als Scriptprocessor B fertig ist, was dann??
der eventhandler von scriptprocessor a wird in die eventqueue eingehängt(auch die kann volllaufen).

Jetzt weiß ich was Du mit einem Laufzeitfehler meintest
nein, ich meinte

Code:
<!DOCTYPE html>
<html>
<head>
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
	<title>schnell_test</title>
	<script type="text/javascript">
		function run(){
			run();
		}
	</script>
	</head>
	<body onload="run()">
	</body>
	</html>
das hattest du beschrieben, dein jetziges bsp. läuft nur zu lange, das mag der browser auch nicht. das löst man indem man js unterbricht und den browser mal wieder zum zug kommen lässt
 
tsseh schrieb:
(muss ich jedesmal dazuschreiben webworker mal außen vor?).
Nein musst du nicht. Web Worker wären der idealfall, nur leider gibt es keine Web Audio Schnittstelle in Web Workern.

Im übrigen:
cwilso commented on 24 Mar 2014 schrieb:
Well, in Chrome at least, the actual audio processing is not happening in the main thread anyway (aside from ScriptProcessors, which is a separate issue).
https://github.com/WebAudio/web-audio-api/issues/16



tsseh schrieb:
der eventhandler von scriptprocessor a wird in die eventqueue eingehängt(auch die kann volllaufen).
Was ist den der eventqueue? hätte da gerne mehr Technische Informationen.

tsseh schrieb:
dein jetziges bsp. läuft nur zu lange, das mag der browser auch nicht. das löst man indem man js unterbricht und den browser mal wieder zum zug kommen lässt
Wie unterbricht man den JS?
 
Was ist den der eventqueue? hätte da gerne mehr Technische Informationen.
http://forum.jswelt.de/javascript/62451-javascript-alert-chrome-2.html#post400099

Wie unterbricht man den JS?
du startest js mit intervall 0. das läuft auf ca. 15-30 ms hinaus. wenn dein code länger läuft als diese zeit, oder nur fast so lange. kommt der browser außer dein js abzuarbeiten zu fast nichts anderem.
entweder wählst du das intervall größer oder reduzierst die laufzeit des js.
unterbrechen tust du mit setTimeout. sprich wenn du nach 5 ms den rest des codes erst mit setTimeout in 30 ms startest hast du nur 5 ms laufzeit und der browser hat 10-25.
das nützt dir nur hier nichts, da du dann immer mehr code nach hinten aufschiebst. und die eventqueue läuft voll.
 
tsseh schrieb:
http://forum.jswelt.de/javascript/62...tml#post400099 (Javascript-Alert und Chrome)
Asso ja, das hatten wir schon mal, ich vergaß.

tsseh schrieb:
das nützt dir nur hier nichts, da du dann immer mehr code nach hinten aufschiebst. und die eventqueue läuft voll.
Einmal das und 2tens captured die Soundkarte ja unendlich, würde ich js beenden könne ich ja was verpassen.
 
Zurück
Oben