WCG: Forschrittsanzeige?

Moin,

ich hab ein sehr rechenintensives Skript, bei dem ich den Fortschritt anzeigen lassen will.

for($i=0;$i<100;$i++) { // Startet hier das Skript je 100 mal }

Wie ihr seht, wird das ganze 100 mal ausgeführt. Nun würde ich gerne mit JS zum Beispiel am Ende jedes Schleifendurchlaufes die Variable Forschritt um eins hochzählen und dann per document.write(Fortschritt); oder ähnlichem das auf dem Bildschirm ausgeben. Ich hatte gehofft, dass das auch immer geändert wird auf dem Bildschirm, wenn gerade ein Schleifendurchlauf fertig ist. Ist leider nicht der Fall. Gibt es eine Möglichkeit das zu realisieren, wenn ja wie? Wenn nein gibt es andere Sprachen, mit denen ich das erledigen könnte?

  1. for($i=0;$i<100;$i++) { // Startet hier das Skript je 100 mal }

    Hört sich nicht sonderlich vernünftig an, aber bitte.

    Wie ihr seht, wird das ganze 100 mal ausgeführt. Ich hatte gehofft, dass das auch immer geändert wird auf dem Bildschirm, wenn gerade ein Schleifendurchlauf fertig ist.

    Ist dein Script ein PHP-Script (lt. lang-Attribut um code-Abschnitt) oder ein JavaScript-Script (lt. Kategorie)?

    Gibt es eine Möglichkeit das zu realisieren, wenn ja wie?

    Es gibt für fast alles eine Möglichkeit

    Wenn nein gibt es andere Sprachen, mit denen ich das erledigen könnte?

    Beschreibe erst, was genau du tust. Eine Schleife die nach jedem Durchlauf etwas tut ist in JavaScript nichts Tragisches - mit PHP und dem Client eine Info zu geben ist zwar komplizierter, aber auch nicht unmöglich.

    1. Beschreibe erst, was genau du tust. Eine Schleife die nach jedem Durchlauf etwas tut ist in JavaScript nichts Tragisches - mit PHP und dem Client eine Info zu geben ist zwar komplizierter, aber auch nicht unmöglich.

      Ok, hatte ich mich wohl etwas undeutlich ausgedrückt.

      Mein Skript ist in PHP geschrieben. Bei jedem Aufruf, rechnet es und gibt Daten zurück. Diese werden gesammelt, bis nach allen 100 Durchläufen die statistischen Mittelwerte ausgegeben werden. Da das ganze bei 100 Durchläufen schon mal dauern kann, möchte ich mit JS (was besseres ist mir nicht eingefallen) eine Art Balken anbieten, in dem der Fortschritt steht. Ich hatte wie beschrieben einfach ein document.write(Fortschritt); am Ende jeder Zeile zum Testen eingefügt. Allerdings, wird erst ALLES zu Ende gerechnet und dann erscheint mir die Liste der Zahlen von 1-100 und dann die Ausgabe der statistischen Mittelwerte. Die Liste der Zahlen 1-100 sollte aber ja eigentlich nicht erst so spät erscheinen, sondern wenn sie fertig sind.

      1. Mein Skript ist in PHP geschrieben. Bei jedem Aufruf, rechnet es und gibt Daten zurück.

        Dann hilft dir ggf. eine Comet-artige-Technik.

        Rufe dein PHP-Script in einem iframe auf und gib nach jedem Schleifendurchlauf einen JavaScript-Schnipsel aus, der im Eltern-Dokument den Statusbalken manipuliert.

        echo '<script type="text/javascript">parent.change_progressbar('' . $i . '')</script>';

        Die funktion change_progressbar() ändert dann einfach meinetwegen die Breite des Balkens auf $i Prozent und schreibt das in die Mitte rein.

  2. Moin,

    ... und dann per document.write(Fortschritt); oder ähnlichem das auf dem Bildschirm ausgeben.

    document.write() wird nur während des Aufbaus der Seite ausgeführt. Zum Beispiel um Daten anzuzeigen, die ohne Javascript keinen Sinn ergeben.

    Du musst ein Element vorsehen, z.B.
    <span id='fortschritt'></span>

    in das du die Zahl hineinschreibst
    document.getElementById('fortschritt').innerHTML = fortschritt;

    Kalle

    1. Du musst ein Element vorsehen, z.B.
      <span id='fortschritt'></span>

      in das du die Zahl hineinschreibst
      document.getElementById('fortschritt').innerHTML = fortschritt;

      Hmm, funktioniert schon teilweise. Ich habe

      <script type="text/javascript">  
                var Fortschritt = document.getElementById('Fortschritt').innerHTML;  
                Fortschritt++;  
                document.getElementById('Fortschritt').innerHTML = Fortschritt;  
              </script>
      

      und

      echo "<span id='Fortschritt'>0</span>";

      davor stehen. Wenn ich ihn nun rechnen lasse, rechnet er und rechnet er - es werden die Zahlen 0,32,65 und dann 100 angezeigt. Dazwischen werden aber keine Zahlen angezeigt - woran liegt das?

      1. davor stehen. Wenn ich ihn nun rechnen lasse, rechnet er und rechnet er - es werden die Zahlen 0,32,65 und dann 100 angezeigt. Dazwischen werden aber keine Zahlen angezeigt - woran liegt das?

        Das müßtest du uns sagen.

        Struppi.

      2. Hmm, funktioniert schon teilweise. Ich habe

        <script type="text/javascript">

        var Fortschritt = document.getElementById('Fortschritt').innerHTML;
                  Fortschritt++;
                  document.getElementById('Fortschritt').innerHTML = Fortschritt;
                </script>

          
        Du nimmst den Wert, der im Element 'Fortschritt' steht, erhöhst ihn um 1 und schreibst ihn zurück. Warum sollte da jemals mehr als '1' herauskommen?  
          
        Angenommen, der Codeschnippsel ist Teil der Rechenfunktion, die 100 mal durchlaufen wird, dann bedeutet  
          
        
        > davor stehen. Wenn ich ihn nun rechnen lasse, rechnet er und rechnet er  
          
        klingt seeehr lange. Wie lange? 100 Sekunden? 10? 2?  
          
        
        > - es werden die Zahlen 0,32,65 und dann 100 angezeigt. Dazwischen werden aber keine Zahlen angezeigt - woran liegt das?  
          
        Kaffeesatzlesen:  
          
        1\. Die Zahlen werden zu schnell angezeigt, die fehlenden werden "verschluckt", schliesslich zeigt das Display nur eine endliche Anzahl von Bildern pro Sekunde.  
          
        2\. Für die Anzeige braucht Javascript intern vermutlich so etwas wie ein "Refresh", der kommt eben nicht nach jeder Zahl.  
          
        Test:  
        Gib mal einen alert( Fortschhritt ) aus nach Fortschritt++;  
          
        Kalle
        
          1. Die Zahlen werden zu schnell angezeigt, die fehlenden werden "verschluckt", schliesslich zeigt das Display nur eine endliche Anzahl von Bildern pro Sekunde.

          2. Für die Anzeige braucht Javascript intern vermutlich so etwas wie ein "Refresh", der kommt eben nicht nach jeder Zahl.

          ALLE Zahlen werden per Alert angezeigt, wenn ich das möchte - im <span> geändert, bzw. refreshed wird nur 0,32,65 und 100. Kann man denn so einen Refresh per Hand anstoßen? Mein Skript läuft schon mal bis zu 50 Sekunden trotz i7 920 - längere Rechenzeiten sind bei Erhöhung der Parameter durchaus denkbar.

  3. Hi,

    for($i=0;$i<100;$i++) { // Startet hier das Skript je 100 mal }

    Eine Schleife ist für animationen ungeeignet, verwende setTimeout/Intervall statt dessen.

    Gruesse, Joachim

    --
    Am Ende wird alles gut.
    1. for($i=0;$i<100;$i++) { // Startet hier das Skript je 100 mal }
      Eine Schleife ist für animationen ungeeignet, verwende setTimeout/Intervall statt dessen.

      setTimeout - das muss eine neue PHP-Funktion sein :p

      1. Hi,

        setTimeout - das muss eine neue PHP-Funktion sein :p

        Ups, allerdings muss ich zu meiner Entlastung auf die Kategorie verweisen... und überhaupt soll ich eigentlich was schaffen, nicht daddeln ;-)

        Gruesse, Joachim

        --
        Am Ende wird alles gut.
        1. Ups, allerdings muss ich zu meiner Entlastung auf die Kategorie verweisen...

          Das hat mich auch verwirrt, darum hab' ich nachgefragt :D