Forum: PC-Programmierung Javascript sleep


von Stephan (Gast)


Lesenswert?

hi Leute versuche mich etwas in javascript einzuarbeiten.
Ich versuche ein neues Fenster, mit mehren Tabs auf zumachen.
Der Code läuft so, aber da die Tabs zu schnell aufgehen, ist die Anfrage 
an den Server "zu groß(viel)". Es kommt zu lade Fehlern, das zeigt sich 
das teile des Frames nicht richtig geladen werden. Refreshe ich die 
Seiten von Hand, wird wieder alles richtig angezeigt.
1
function openNewWindow (StartId, Zahl) {
2
  Zahl = parseInt(Zahl, 10);
3
  StartId = parseInt(StartId, 10);
4
  
5
  if (isNaN(Zahl) || isNaN(StartId)) {
6
    alert("Sie müssen eine Zahl eingeben!");
7
    return;
8
  }
9
  
10
  Adresse="http://testsite.mycom/test.html&id=";
11
  
12
  for (i = StartId; i < StartId + Zahl; ++i)
13
  {
14
      <!-- window.open(Adresse + i, _self, "toolbar=yes, scrollbars=yes,width=1200,height=800,left=100,top=200"); -->
15
      <!-- newTab(); -->
16
      
17
      if (i == StartId)
18
      {
19
         myWindow= window.open(Adresse + i, "_blank", "toolbar=yes, scrollbars=yes,width=1200,height=800,left=100,top=200");
20
      }
21
      else
22
      {
23
         form = myWindow.document.createElement("form");
24
         form.method = "POST";
25
         form.action = Adresse + i;
26
         form.target = "_blank";
27
         myWindow.document.body.appendChild(form);
28
         <!-- form.submit(); -->
29
         setTimeout(form.submit(), 300)
30
      }
31
  }
32
}

ist setTimeout nicht richtig?
Der Befehl 'form.submit()' sollte nach 0,3 Sekunden ausgeführt werden!
was für Möglichkeiten für ein 'sleep' gibt es denn noch?

Stephan

von Jan H. (j_hansen)


Lesenswert?

Stephan schrieb:
> ist setTimeout nicht richtig?
> Der Befehl 'form.submit()' sollte nach 0,3 Sekunden ausgeführt werden!
> was für Möglichkeiten für ein 'sleep' gibt es denn noch?

Doch, ist schon richtig. Aber mit "()" wird das Statement sofort 
ausgeführt. Du möchtest der Funktion "setTimeout" die Funktion nur 
übergeben. Also entweder (ungetestet):
1
setTimeout(form.submit, 300);

oder:
1
setTimeout(function() {
2
    form.submit();
3
}, 300);

von Stephan (Gast)


Lesenswert?

Danke für die Info, aber beides geht leider nicht!
Liegt das vielleicht noch an firefox?

ich habe auch schon sowas getestet, aber es scheint nur 1mal zu 
funktionieren!
1
  function sleep(delay) {
2
    var start = new Date().getTime();
3
    var EndTime= start + delay;
4
    var NowTime;
5
    do{
6
      NowTime= new Date().getTime();
7
    }while (NowTime < EndTime);
8
  }

Stephan

von Jan H. (j_hansen)


Lesenswert?

Was "geht nicht"? Kommt ein JS-Fehler? Am Firefox liegt es bestimmt 
nicht.

von Stephan (Gast)


Lesenswert?

Ich habe die Zeit mal auf 3000 gesetzt und es scheint so, als wird bei 
allen versionen die Tabs auf einmal geöffnet!

Bei meiner Version mit 'Date' wir ein mal eine Verzögerung erzeugt!

Stephan

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Poste doch einfach mal den aktuellen Code, und versuch es erst mal mit 
einem Minimalbeispiel!

Du platzierst z.B. DIVERSER Variablen im Globalen Scope --> Nix gut.
Ansonsten musst du den Timeout natürlich zusammen mit deinem 
Schleifenzähler erhöhen, das Timeout wartet nicht!
(Und warten wäre in JS sowieso gaaaanz böse, da es nur einen Thread 
gibt!)

Stephan schrieb:
> Der Code läuft so, aber da die Tabs zu schnell aufgehen, ist die Anfrage
> an den Server "zu groß(viel)". Es kommt zu lade Fehlern, das zeigt sich
> das teile des Frames nicht richtig geladen werden.

Dann ist das kein Server sondern Mist... Hier sollte man als erstes 
ansetzen.

: Bearbeitet durch User
von Stephan (Gast)


Lesenswert?

Ok, hier mal ein Beispiel mit google!
1
<html>
2
<head>
3
<title>Test</title>
4
<script type="text/javascript">
5
var myWindow;
6
  function sleep(delay) {
7
    var start = new Date().getTime();
8
    var EndTime= start + delay;
9
    var NowTime;
10
    do{
11
      NowTime= new Date().getTime();
12
    }while (NowTime < EndTime);
13
  }
14
  
15
function openNewWindow (StartId, Zahl) {
16
  Zahl = parseInt(Zahl, 10);
17
  StartId = parseInt(StartId, 10);
18
  
19
  if (isNaN(Zahl) || isNaN(StartId)) {
20
    alert("Sie müssen eine Zahl eingeben!");
21
    return;
22
  }
23
  
24
  Adresse="http://www.google.de";
25
  
26
  for (i = StartId; i < StartId + Zahl; ++i)
27
  {
28
      if (i == StartId)
29
      {
30
         <!-- 1. Durchlauf Fenster erzeugen -->
31
         myWindow= window.open(Adresse, "_blank", "toolbar=yes, scrollbars=yes,width=1200,height=800,left=100,top=200");
32
      }
33
      else
34
      {
35
         <!-- hier nur noch neue Tabs -->
36
         var  form;
37
         form = myWindow.document.createElement("form");
38
         form.method = "GET";
39
         form.action = Adresse;
40
         form.target = "_blank";
41
         myWindow.document.body.appendChild(form);
42
         <!-- form.submit();  --> <!-- hier werden alle Tabs gleichzeitig erzeugt! -->
43
   
44
         <!-- setTimeout(form.submit, 3000); --> <!-- hier wird nun kein weiterer Tab erzeugt! nur Window erstellt! -->
45
         
46
         <!-- setTimeout(function() { form.submit(); }, 3000);  --> <!-- hier wird nun kein weiterer Tab erzeugt! nur Window erstellt! -->
47
      }
48
      sleep(3000); <!-- hier wird nun kein weiterer Tab erzeugt! nur Window erstellt! aber 1mal gewartet -->
49
  }
50
}
51
</script>
52
</head>
53
<body>
54
<form name="OpenWinTabsForm" action="">
55
<p>how many windows will you open?</p>
56
<input type="text" name="Anzahl">
57
<input type="button" value="Open new Window with Tabs"
58
onclick="openNewWindow(0, document.OpenWinTabsForm.Anzahl.value)">
59
</form>
60
</body>
61
</html>

Leider musste ich die Methode hier auf GET Ändern!
Damit wird das Verhalten noch schlechter. Es funktioniert nur ohne 
setTimeout!!!!

Stephan

von Stephan (Gast)


Lesenswert?

noch eine Sache, früher hatte ich alle Links mit "window.open" 
aufgemacht, was aber bei meinem Firefox V30.0 nach einigen malen zum 
Absturz führte.

Jetzt mit der Tab Lösung sah es sehr gut aus, aber jetzt nach etlichen 
probieren frisst der FF sich wieder voll.

Hab ich hier ein Memory Leak drin?
Kaltstart FF ~450MB RAM
Nach öffnen einiger Fenster mit etlichen Tabs ~1GB

Stephan

von Stephan (Gast)


Lesenswert?

So mit 1.5GB wars für den FF zu viel und er ist abgestürzt!!!
Da muss doch noch ein Memory Fehler im Programm sein!

Bitte helft mir. :-§

Stephan

von Progger (Gast)


Lesenswert?

Zuerst einmal ist mir nicht bekannt, dass es den Befehl "sleep()" in JS 
gibt. Bist du dir sicher, dass das so passt?
Dann sollte dir bewusst sein, dass deine Variable "form" bei jedem 
Durchlauf überschrieben wird. Schöner wäre es, wenn du den gesamten 
else-Zweig in ein setTimeout schreiben würdest. Vielleicht behebt das 
dein Problem schon.
Ansonsten lass das mit dem Fenster öffnen einmal und gib nur Alerts oder 
Konsolenmeldungen aus, das ist einfacher zu testen.

von Stephan (Gast)


Lesenswert?

Progger schrieb:
> Zuerst einmal ist mir nicht bekannt, dass es den Befehl "sleep()" in JS
> gibt. Bist du dir sicher, dass das so passt?
Ja, habe ich am Anfang als Funktion erstellt

> Dann sollte dir bewusst sein, dass deine Variable "form" bei jedem
> Durchlauf überschrieben wird.
Ja und? Form ist nur ein Pointer auf das neu erstellte Objekt.
und mit "myWindow.document.body.appendChild(form);" wir das objekt in 
einen Container gelegt. Ist hier dann nicht der Container für die 
Verwaltung zuständig? wie in C++?

das andere muss ich mal schauen wie man das macht.
Danke.

Stephan

von Daniel A. (daniel-a)


Lesenswert?

Stephan schrieb:
> So mit 1.5GB wars für den FF zu viel und er ist abgestürzt!!!
> Da muss doch noch ein Memory Fehler im Programm sein!

Eher unwahrseinlich, javascript sollte garbage collection unterstützen, 
und endlose rekursionen abbrechen. Solange man sich keine arrays mit 
sehrgrossen unterarrays mit zufälligem Inhalt anlegt, ist das nicht 
möglich, und selbst dann dürfte firefox nicht abstürzen! Dass muss ein 
fehler von firevox sein.

>  function sleep(delay) {
>    var start = new Date().getTime();
>    var EndTime= start + delay;
>    var NowTime;
>    do{
>      NowTime= new Date().getTime();
>    }while (NowTime < EndTime);
>  }

Tue soetwas Niemals!!! Schleifen müssen wenn immer möglich vermieden 
werden, denn solange diese lauft passiert nichts!!! Nichteinmal das 
scrollen oder das nächste frame anzeigen, alles wird Blockiert!!!

Versuche statdessen mit setTimeout zu arbeiten! Verwende 
objektorientierung ( klassen ), dass macht alles einfacher!

Beispiel einer classe x mit asynchronem for-schleifenersatz, getestet:
1
  function next(that,f,t,args){
2
    setTimeout(function(that,f,args){
3
      f.apply(that,args);
4
    },t,that,f,args);
5
  }
6
7
  function x(){ // class x
8
    // private members
9
    var i=0; // private variabe i
10
    // public members, accesible with this.name
11
    var ret = {
12
      "y": function(p1){ // public memberfunction y
13
14
        if(!(i<10)) return 0; // condition
15
16
        document.body.innerHTML = p1 + i; // schleifenrumpf
17
18
        i++; // nach schleifendurchgang
19
20
        next(this,this.y,1000,arguments);
21
      }
22
    };
23
    return ret;
24
  }
25
26
var q = new x();
27
q.y("test: ");

zum ausprobieren:
http://jsfiddle.net/GfQ6C/2/

: Bearbeitet durch User
von Stephan (Gast)


Lesenswert?

Wow danke für die Infos.
Aber bei Klassen bin ich noch nicht angekommen und für heute reicht es.
Danke.

Ich werde mir das mal morgen ansehen.
Das mein sleep nicht so toll ist, hatte ich schon im Netz gefunden, war 
aber für mich als C, C++ Programmierer aus dem stehgreif zu 
programmieren.

>Eher unwahrseinlich, javascript sollte garbage collection unterstützen,
>und endlose rekursionen abbrechen. Solange man sich keine arrays mit
>sehrgrossen unterarrays mit zufälligem Inhalt anlegt, ist das nicht
>möglich, und selbst dann dürfte firefox nicht abstürzen! Dass muss ein
>fehler von firevox sein.
Das kann ich nicht beurteilen, ist aber reproduzierbar.
Nimm oben die if Abfrage raus und ersetze sie nur durch die window.open 
Zeile und mach 4x oder so 30 Seiten auf, dann ist ende!!!

Gute Nacht.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Stephan schrieb:
> und mach 4x oder so 30 Seiten auf, dann ist ende!!!

Und du meinst nicht das der FF vielleicht nicht unbedingt darauf 
ausgelegt ist mehr als 100 Fenster in kürzester Zeit zu öffnen?

Und wenn bei dir FF 450MB OHNE gleich zu anfang anzeigt hast du 
vielleicht etwas viele Plugins aktiviert...

Und ob window.open oder Forms das richtige sind hängt doch davon ab was 
du willst, benötigst du überhaupt das was der Server zurückliefert in 
einem extra Frame?

Daniel A. schrieb:
> Beispiel einer classe x mit asynchronem for-schleifenersatz

Noch verworrener ging es aber nicht oder? ;-P
1
function forWithDelay(startIndex, endIndex, sleepValue, action) {
2
    var i = startIndex;
3
    var that = this;
4
    var doNext = function() {
5
        if (i < endIndex) {
6
            action.call(that, i);
7
            i++;
8
            window.setTimeout(doNext, sleepValue);
9
        }
10
    }
11
    doNext();
12
};
13
14
forWithDelay(0, 100, 2000, function(i) {
15
    //Hier kannst du dann anstelle des folgenden dein Form erzeugen und Absenden...
16
    document.body.innerHTML = 'action' + i;
17
});
http://jsfiddle.net/9J9uG/

Ich würde aber trotzdem überlegen, ob du nicht mit AJAX Aufrufen besser 
bedient bist. ggf. interesante Rückgaben kannst du dann ganz einfach in 
deiner aktuellen Seite einfügen ohne hunderte Tabs zu öffnen.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.