Flavio: Rechenleistung freigeben / Sleep

Hallo!!!

Hoffe dass mir jemand helfen kann...

Ich brauche eine funktion die mir das System entlastet, da ich mit einer While Schleife andauernd einen Wert abfragen muss.
Wenn ich aber meine Schleife einfach so schreibe:

while(Wert != "OK"){
}

Wird die CPU zu 100% belastet (was auch logisch ist...) und die Funktion die den Wert abändern muss komm nicht mehr dazu etwas zu tun!!

In Visual Basic wäre das Problem mi einem "DoEvent" zu lösen, habe aber nichts änliches gefunden.

Bitte helft mir!!Bin am verzweifeln!!!

Flavio

  1. Hallo Flavio,

    mit 'ID = setInterval("funktion()", 10);' kannst Du in bestimmten Zeitintervallen die Funktion "funktion()" ausführen. Dann wird der Prozessor nur alle zehn Millisekunden belastet und nicht die ganze Zeit.

    Hoffe, das hilft Dir.

    Gruß

    Niggel

    1. Hallo Flavio,

      mit 'ID = setInterval("funktion()", 10);' kannst Du in bestimmten Zeitintervallen die Funktion "funktion()" ausführen. Dann wird der Prozessor nur alle zehn Millisekunden belastet und nicht die ganze Zeit.

      Hoffe, das hilft Dir.

      Gruß

      Niggel

      Nun sieht meine Schleife so aus:
      while(Wert!="OK"){
           ID = setInterval("Warte()", 1);
      }

      Wobei die Funktion Warte() nichts unternimmt:

      function Warte(){
      }

      Leider steigt die Prozessorleistung immer noch auf 100% und alles bleibt stehen.

      Alternativen?

      Flavio

      1. Hallo, Flavio

        Leider steigt die Prozessorleistung immer noch auf 100% und alles bleibt stehen.

        es hängt davon ab, _wie_ setInterval() implentiert ist. Nachdem JavaScript nicht unbedingt _die_ Methode der Wahl ist, wenn man ein multitasking-fähiges Echtzeitsystem aufbauen will, kann es durchaus sein, dass setIntervall() selbst nur eine auf die CPU-Leistung normierte for-loop darstellt. Und die nützt Dir nix.

        Vielleicht, wenn Du uns verraten würdest _worauf_ Du eigentlich wartest, könnte man eine Variation finden, die das mit einem normalen Event-Handler erschlagen kann (platsch !).

        Gruß
        Hans-Peter

        1. Hallo Hans-Peter

          es hängt davon ab, _wie_ setInterval() implentiert ist. Nachdem JavaScript nicht unbedingt _die_ Methode der Wahl ist, wenn man ein multitasking-fähiges Echtzeitsystem aufbauen will, kann es durchaus sein, dass setIntervall() selbst nur eine auf die CPU-Leistung normierte for-loop darstellt. Und die nützt Dir nix.

          Was meinst du damit? Soll es heissen das meine CPU anstatt zu warten einfach eine Schleife erstellt wie ich sie gemacht habe? Was muss ich tun um dies zu kontrollieren?

          Vielleicht, wenn Du uns verraten würdest _worauf_ Du eigentlich wartest, könnte man eine Variation finden, die das mit einem normalen Event-Handler erschlagen kann (platsch !).

          Aus dem EventHandler wird eine php seite gestartet die auf eine Datenbank zugreift (muss so sein da ich Datenbankzugriffe nur aus php durchführen darf...)und danach wird wieder mit Javascript ein Feldinhalt abgeändert.
          Dieses Feld wird aus dem EventHandler aus auf ein change überwacht oder mit setInterval jede X Sekunden überprüft (hab beides ausprobiert).

          Beim ersten Fall wird der Change event zu früh bearbeitet (weiss auch nicht warum...). Im zweiten Fall Geht die CPU auf 100% und nichts geht mehr...

          Ich hoffe dass es Verständlich ist...

          Grüsse

          Flavio

      2. Die Schleife musst Du weglassen:

        ID = setInterval("Warte()", 10);

        function Warte(){
          if (Wert != "OK") {
            ID = setInterval("Warte()", 10);
          }
        }

        so müsste es gehen.

        1. Hallo Niggel

          ID = setInterval("Warte()", 10);

          function Warte(){
            if (Wert != "OK") {
              ID = setInterval("Warte()", 10);
            }
          }

          so müsste es gehen.

          nein auch nicht. setInterval rufst ja die Funktion alle 10 ms auf. So wie du sie aufbaust, wird mit jedem Aufruf erneut ein setInterval initialisiert.

          2 Möglichkeiten gibt es:

          ID = window.setTimeout("Warte()", 10);

          function Warte(){
            if (Wert != "OK") {
           //Wert stimmt nicht, neuer Wartezyklus wird eingeleitet
              ID = window.setTimeout("Warte()", 10);
            }
          }

          oder

          ID = window.setInterval("Warte()", 10);

          function Warte(){
            if (Wert == "OK") {
          //Wert stimmt, Intervallschleife wird beendet
              ID = window.clearInterval("Warte()", 10);
            }
          }

          Mehr dazu:
          http://selfhtml.teamone.de/javascript/objekte/window.htm#clear_interval
          http://selfhtml.teamone.de/javascript/objekte/window.htm#set_interval
          http://selfhtml.teamone.de/javascript/objekte/window.htm#set_timeout

          Viele Grüße

          Antje

          1. Hallo Niggel

            ID = setInterval("Warte()", 10);

            function Warte(){
              if (Wert != "OK") {
                ID = setInterval("Warte()", 10);
              }
            }

            so müsste es gehen.

            nein auch nicht. setInterval rufst ja die Funktion alle 10 ms auf. So wie du sie aufbaust, wird mit jedem Aufruf erneut ein setInterval initialisiert.

            2 Möglichkeiten gibt es:

            ID = window.setTimeout("Warte()", 10);

            function Warte(){
              if (Wert != "OK") {
            //Wert stimmt nicht, neuer Wartezyklus wird eingeleitet
                ID = window.setTimeout("Warte()", 10);
              }
            }

            oder

            ID = window.setInterval("Warte()", 10);

            function Warte(){
              if (Wert == "OK") {
            //Wert stimmt, Intervallschleife wird beendet
                ID = window.clearInterval("Warte()", 10);
              }
            }

            Mehr dazu:
            http://selfhtml.teamone.de/javascript/objekte/window.htm#clear_interval
            http://selfhtml.teamone.de/javascript/objekte/window.htm#set_interval
            http://selfhtml.teamone.de/javascript/objekte/window.htm#set_timeout

            Viele Grüße

            Antje

            Hallo Antje,

            da ist ein kleiner Fehler in Deiner Fehlerkorrektur:
            anstelle ID = window.clearInterval("Warte()", 10);
            muss window.clearInterval(ID); verwendet werden.
            Siehe z.B. mein JavaScript-Spiel unter
            http://www.tu-chemnitz.de/~luta/play/threefit.html

            Viele Grüße, Lutz :-)