Wowbagger: gibt es eine art 'sleep-funktion' ?

Hallo 'SelfHTML gemeinde'...

Ich suche eine möglichkeit in javascript einfach nur eine bestimmte anzahl milisekunden lang zu warten. Gibt
es vielleicht eine funktion wie Sleep(ms) oder Idle(ms)?

Ich kenne setTimeout(), aber die ist für meine zwecke unbrauchbar, weil ich ja keine andere funktion aufrufen oder überhaupt irgend etwas machen möchte außer warten...

Kann mir jemand helfen?

Danke...bis dann
/*,*/
Wowbagger

  1. Hallo Wowbagger

    Ich kenne setTimeout(), aber die ist für meine zwecke unbrauchbar, weil ich ja keine andere funktion aufrufen oder überhaupt irgend etwas machen möchte außer warten...

    Ohne setTimeout geht's meines Wissens nicht. Kannst ja eine leere Funktion benutzen, etwa so:

    function Nix()
    { /* gar nix weiter */ }

    Anweisung ...;
    Anweisung ...;
    window.setTimeout("Nix()",5000);
    Anweisung ...;

    Dann wartet er im Programmablauf 5 Sekunden, ruft die Funktion auf, in der nix passiert, und macht dann weiter.

    viele Gruesse
      Stefan Muenz

    1. Danke... wow, das ging ja schnell :-o

      Ohne setTimeout geht's meines Wissens nicht. Kannst ja eine leere Funktion benutzen, etwa so:

      function Nix()
      { /* gar nix weiter */ }

      Anweisung ...;
      Anweisung ...;
      window.setTimeout("Nix()",5000);
      Anweisung ...;

      Dann wartet er im Programmablauf 5 Sekunden, ruft die Funktion auf, in der nix passiert, und macht dann weiter.

      Daran hatte ich auch schon gedacht, aber das funktioniert so leider nicht :-(
      Er wartet zwar 5 sek. bis er Nix() aufruft, arbeitet aber bis dahin brav all das ab, was nach der setTimeout anweisung noch kommt (setTimeout() ist quasi so eine art timer-interrupt-handler)

      In meinem speziellen problem (es geht 'mal wieder um's thema animierte hover-buttons :-)) *darf* er aber nicht mit dem programmablauf weitermachen, bevor die wartezeit um ist (ich brauche quasi eine art for()-schleife mit kalkulierbarer ausführungszeit (=prozessorunabhängig!)

      Kann man hier vielleicht mit funktionen zur uhrzeit was tricksen?

      Bis denn dann...
      /*,*/ (heute eher @,@)
      Wowbagger

      1. Hallo Wowbagger

        Er wartet zwar 5 sek. bis er Nix() aufruft, arbeitet aber bis dahin brav all das ab, was nach der setTimeout anweisung noch kommt (setTimeout() ist quasi so eine art timer-interrupt-handler)

        Dann stopf doch den ganzen Code, der "danach" kommt, in die Funktion. Die Funktion ist dann einfach eine Art Unterprogramm, das zu einem bestimmten Zeitpunkt aufgerufen wird.

        viele Gruesse
          Stefan Muenz

      2. Hi!

        Daran hatte ich auch schon gedacht, aber das funktioniert so leider nicht :-(
        Er wartet zwar 5 sek. bis er Nix() aufruft, arbeitet aber bis dahin brav all das ab, was nach der setTimeout anweisung noch kommt (setTimeout() ist quasi so eine art timer-interrupt-handler)

        Jepp.
        Du könntest aber z.B. eine Variable setzen, wo du gerade warst, und diese dann beim nächsten Funktionsaufruf abfragen:

        var wobinich=1;

        function irgendwas()
        {
            if (wobinich==1) {
               /* mach irgendwas */
               setTimeOut("irgendwas()",5000);
            }
            if (wobinich==2) {
               /* mach weiter */
               setTimeOut("irgendwas()",5000);
            }
            wobinich++;
        }

        Aber Vorsicht, daß du nicht das Flag im if-Bereich hochsetzt und dadurch die nächsten Bedingungen wahr macht!

        Kann man hier vielleicht mit funktionen zur uhrzeit was tricksen?

        Könnte etwa so gehen:

        jetzt = new Date();
        biswann = jetzt.getTime() + 5000;
        while (jetzt.getTime() < biswann) {}

        Aber ich nehme stark an, daß die setTimeOut-Methode CPU-freundlicher ist...

        Bis denn dann...

        Kommt mir jetzt irgendwie bekannt vor... ;)

        Ciao,
        Mirko

        1. Hallo Mirko!

          Bis denn dann...

          Kommt mir jetzt irgendwie bekannt vor... ;)

          Tja.. manche Audrucksformen werden mit der Zeit beliebt!!! Aber so lange darunter nicht PAF (patrickausfrankfurt) kommt, dann ist es mir nur recht!

          Bis danndann

          PAF (patrickausfrankfurt) - nur echt mit dem TBGG

  2. Hallo 'SelfHTML gemeinde'...

    Ich suche eine möglichkeit in javascript einfach nur eine bestimmte anzahl milisekunden lang zu warten. Gibt
    es vielleicht eine funktion wie Sleep(ms) oder Idle(ms)?

    Ich kenne setTimeout(), aber die ist für meine zwecke unbrauchbar, weil ich ja keine andere funktion aufrufen oder überhaupt irgend etwas machen möchte außer warten...

    Kann mir jemand helfen?

    Jou.

    Danke...bis dann
    /*,*/
    Wowbagger

    Hallo Wowbagger,

    ich hab da so ein kleines ;-) Funktioenchen, was Dir helfen koennte.

    <Funktioenchen>

    <html>
    <head>
    <title>Test</title>
    <script language="JavaScript">
    function now()
    {
        var Act = new Date();
        return Act;
    }

    function sleep()
    {
        var DelaySeconds = 5; /* 5 Sekunden Verzoegerung */
        var DelayMinutes = 0; /* 0 Minuten  Verzoegerung */
        var DelayHours   = 0; /* 0 Stunden  Verzoegerung */
        var DelayDays    = 0; /* 0 Tage     Verzoegerung */
        var DelayMonths  = 0; /* 0 Monate   Verzoegerung */
        var DelayYears   = 0; /* 0 Jahre    Verzoegerung */

    var ActTime   = new Date();
        var Seconds   = ActTime.getSeconds();
        var Minutes   = ActTime.getMinutes();
        var Hours     = ActTime.getHours();
        var Days      = ActTime.getDate();
        var Months    = ActTime.getMonth();
        var Years     = ActTime.getYear();
        var FinalTime = ActTime;

    if ((60 - Seconds) < DelaySeconds)
        {
            Seconds = Seconds + DelaySeconds - 60;
            DelayMinutes = DelayMinutes + 1;
        }
        else
        {
            Seconds = Seconds + DelaySeconds;
        }

    if ((60 - Minutes) < DelayMinutes)
        {
            Minutes = Minutes + DelayMinutes - 60;
            DelayHours = DelayHours + 1;
        }
        else
        {
            DelayMinutes = Minutes + DelayMinutes;
        }

    if ((24 - Hours) < DelayHours)
        {
            Hours = Hours + DelayHours - 24;
            DelayDays = DelayDays + 1;
        }
        else
        {
            DelayHours = Hours + DelayHours;
        }

    switch (Months)
    {
      case 0, 2, 4, 6, 7, 9, 11:
       if ((31 - Days) < DelayDays)
       {
        Days = Days + DelayDays - 31;
        DelayMonths = DelayMonths + 1;
       }
       else
       {
        DelayDays = Days + DelayDays;
       }
       break;
      case 3, 5, 8, 10:
       if ((30 - Days) < DelayDays)
       {
        Days = Days + DelayDays - 30;
        DelayMonths = DelayMonths + 1;
       }
       else
       {
        DelayDays = Days + DelayDays;
       }
       break;
      case 1:
       if ((Year % 400) == 0)
       {
        if ((29 - Days) < DelayDays)
        {
         Days = Days + DelayDays - 29;
         DelayMonths = DelayMonths + 1;
        }
        else
        {
         DelayDays = Days + DelayDays;
        }
       }
       else
       {
        if (((Year % 100) == 0) ((Year % 4) != 0))
        {
         if ((28 - Days) < DelayDays)
         {
          Days = Days + DelayDays - 28;
          DelayMonths = DelayMonths + 1;
         }
         else
         {
          DelayDays = Days + DelayDays;
         }
        }
        else
        {
         if ((29 - Days) < DelayDays)
         {
          Days = Days + DelayDays - 29;
          DelayMonths = DelayMonths + 1;
         }
         else
         {
          DelayDays = Days + DelayDays;
         }
        }
       }
       break;
        }

    if ((11 - Months) < DelayMonths)
        {
            Months = Months + DelayMonths - 24;
            DelayYears = DelayYears + 1;
        }
        else
        {
            DelayMonths = Months + DelayMonths;
        }
        Years = Years + DelayYears;

    FinalTime.setSeconds(Seconds);
    FinalTime.setMinutes(Minutes);
    FinalTime.setHours(Hours);
    FinalTime.setDate(Days);
    FinalTime.setMonth(Months);
    FinalTime.setYear(Years);

    while (now() < FinalTime)
        {
        }

    }

    </script>
    </head><body>
    <script language="JavaScript">
    var nun = new Date(now());
    document.writeln(nun);
    sleep();
    var jetzt = new Date(now());
    document.writeln(jetzt);
    </script>
    </body></html>

    </Funktioenchen>

    Wichtig dabei ist, Du musst die kleine Funktion now() auch mitkopieren. Im IE 4.00 klappt das Beispiel mit den Anzeigen, der Netsi 4.x gibt bei den Anzeigen leider "InvalidDate", die Funtionen klappen aber (getestet mittels "alert()").

    Michael N.