Neo: Ausgabe des Bearbeitungsstandes waehrend das Script noch laeuft

Hallo,
um Schlägen vorzubeugen, erst einmal dies:
Ich habe mich durch einen großen Teil des Forums gelesen, und mit selfhtml arbeite ich privat wie beruflich sehr oft. Also wenn die Antwort auf meine Frage irgendwo im Internet zu lesen steht, dann habe ich sie nicht gefunden. Die Informationsmenge ist aber auch gewaltig...

Ich habe ein Perl-Script, dass mehrere statische html-Files generiert (und sie abspeichert). Konkret: für jeden Buchstaben des Alphabets eins. Nun will ich für den Anwender, der das Script aufruft, den aktuellen Stand der Bearbeitung ausgeben, habe also nach jedem einzelnen File einen
print $buchstabe, "\n";
eingebaut.
Nun kommt die Ausgabe aber erst, nachdem das ganze Script fertig ist, also alles auf einmal. Wie kann ich die Ausgabe zeitgenau "erzwingen"?

Danke für jede Reaktion.
Bin heute zum ersten Mal hier im Forum. Feine Sache. Werde öfter kommen. cu
Neo

  1. Hallo auch,

    um Schlägen vorzubeugen, erst einmal dies:
    Ich habe mich durch einen großen Teil des Forums gelesen, und mit selfhtml arbeite ich privat wie beruflich sehr oft. Also wenn die Antwort auf meine Frage irgendwo im Internet zu lesen steht, dann habe ich sie nicht gefunden. Die Informationsmenge ist aber auch gewaltig...

    Ich habe ein Perl-Script, dass mehrere statische html-Files generiert (und sie abspeichert). Konkret: für jeden Buchstaben des Alphabets eins. Nun will ich für den Anwender, der das Script aufruft, den aktuellen Stand der Bearbeitung ausgeben, habe also nach jedem einzelnen File einen
    print $buchstabe, "\n";
    eingebaut.
    Nun kommt die Ausgabe aber erst, nachdem das ganze Script fertig ist, also alles auf einmal. Wie kann ich die Ausgabe zeitgenau "erzwingen"?

    Also, es ist ziemlich schwierig auf so eine ungenaue Information einen Rat zu geben, aber ich versuchs mal.
    Wenn du in einer Schleife bist, würde ich break; und continue; verwenden...
    Ansonsten stellt sich die Frage, wo den Eingriff in das laufende Script ansetzst, du müsstest eigetnlich die ganz Zeit Fragen, ob er das Script unterbrechen, die Datei schreiben und anzeigen soll.
    (Ich denke man darf nicht gleichzeitig in eine Datei schreiben und diese anzeigen wollen.)
    Ich gebe keine Garantie, dass das dir irgendwie helfen kann, vielleicht schreibe ich gerade am
    Thema vorbei... :-)
    Aber genug, auch dir noch ein fröhliches Scripten
    Stefan Ludwig

    1. OK, ich war ungenau.  :-)
      (Wenn man selber im Thema steckt, kann das passieren, dass man Detais vergisst)
      Also: Das Skript rufe ich über einen Button auf einer statischen html-seite auf. Es läuft im hintergrund, generiert html-files und schreibt diese auf die Platte. Es soll diese Files aber nicht anzeigen, die dateien sind für den späteren gebrauch.
      Es soll einfach nur im Browser eine Ausgabe tätigen, dass es fertig ist. Das macht es auch. Ich habe aber in der Script-Schleife, die das Alphabet abklappert, eine Ausgabe des jeweiligen Buchstabens eingebaut, damit der Anwender sehen kann, wie weit die Arbeit schon ist. Diese Ausgaben kommen erst am Ende des Scriptes alle zusammen.

      Ich hätte sie aber gern zeitnah, sozusagen als "Fortschritts-Anzeige".

      Ich hoffe, das war jetzt etwas konkreter  ;-)

      cu
      Neo

      1. Hallihallo,

        (Wenn man selber im Thema steckt, kann das passieren, dass man Detais vergisst)
        Also: Das Skript rufe ich über einen Button auf einer statischen html-seite auf. Es läuft im hintergrund, generiert html-files und schreibt diese auf die Platte. Es soll diese Files aber nicht anzeigen, die dateien sind für den späteren gebrauch.
        Es soll einfach nur im Browser eine Ausgabe tätigen, dass es fertig ist. Das macht es auch. Ich habe aber in der Script-Schleife, die das Alphabet abklappert, eine Ausgabe des jeweiligen Buchstabens eingebaut, damit der Anwender sehen kann, wie weit die Arbeit schon ist. Diese Ausgaben kommen erst am Ende des Scriptes alle zusammen.

        Ja, so kann man einigermassen verstehen, was Sache ist... :-)
        Also, wie wäre es, wenn du statt der Schleife dein Script immer wieder (es sich selbst) aufrufst, denn
        immer wenn das Script fertig ist, gibt es ja die Seite frisch aus, die du generierst. Und dort kannst du dann
        alle Buchstaben, bis zum Zähler (vielleicht ne eigene Datei, die du ausliest und ergänzt),
        auflisten.
        Geht, das? *selbstganzgespanntsei*

        Also, viel Spass noch und man hört sich
        Stefan Ludwig

        1. Hm, klingt gut.
          Dann muss ich mich wohl mal mit dem Thema Rekursion beschäftigen...
          Ob ich das heute noch schaffe ist fraglich, mach um 14:30 Uhr feierabend. Dann erst wieder ab Dienstag. Ich schick ne Mail, wenns geht, ok?
          cu
          Neo

      2. Hallo !

        Wenn du alles richtig gemacht hast, wie ich glaube, sollte die Fortschritts-Anzeige auch so funktionieren, wie du wünschst.

        Kann es vielleicht sein, dass das Perl-Programm insgesamt so schnell abläuft, dass es dir nur so vorkommt, als käme die Anzeige erst ganz am Schluß?

        Laß dir doch spaßeshalber mal statt des Buchstabens die Serverzeit auswerfen!

        Gruß,
        kerki

        P.S.:

        Ich hätte sie aber gern zeitnah ...

        ---------------------------^^^^^^^

        Mein Lieblingswort! :-(((

        1. Hallo !

          Wenn du alles richtig gemacht hast, wie ich glaube, sollte die Fortschritts-Anzeige auch so funktionieren, wie du wünschst.

          Kann es vielleicht sein, dass das Perl-Programm insgesamt so schnell abläuft, dass es dir nur so vorkommt, als käme die Anzeige erst ganz am Schluß?

          Laß dir doch spaßeshalber mal statt des Buchstabens die Serverzeit auswerfen!

          Gruß,
          kerki

          P.S.:

          Ich hätte sie aber gern zeitnah ...
          ---------------------------^^^^^^^

          Mein Lieblingswort! :-(((

        2. Hi kerki,
          (blöd, hab die eMail mit "enter" abgeschlossen, da war der Beitrag gesendet..)

          Wenn du alles richtig gemacht hast, wie ich glaube, sollte die Fortschritts-Anzeige auch so funktionieren, wie du wünschst.

          Kann es vielleicht sein, dass das Perl-Programm insgesamt so schnell abläuft, dass es dir nur so vorkommt, als käme die Anzeige erst ganz am Schluß?

          nein, das script läuft schon ein paar minuten. und zwischendurch kommt nix. ist hier aber auch MSIE.

          P.S.:

          Ich hätte sie aber gern zeitnah ...
          ---------------------------^^^^^^^

          Mein Lieblingswort! :-(((

          danke. hast recht. gehört in meinen Wortschatz, sollte ich aber daraus verbannen. ich meinte natürlich: "ereignisnah", oder einfach "nah am Ereignis".  :-)
          cu Neo

      3. Hallo Neo,
        ich hab nochmals ne ganz andere Idee:
        Also:
        Lass auf dem Rechner vom Client ein Javascript-Programm laufen, das nur dazu da ist,
        zu testen, ob die Datei B.dat (o.ä.) schon existiert: (Bin aber nicht sicher ob das geht.)
        Wenn die Datei dann da ist, lässt du irgendwas auf der Seite, die beim Client aktiv ist (musst du zuerst
        dort aktivieren... erscheinen oder passieren... Was weiss ich, aber so umgehst du das Problem mit dem Neuladen
        der Seite durch Eigenaufruf.

        OKOK, ist ein wenig kompliziert, frag mich einfach per E-Mail, wenn was unklar ist.
        Soweit, sogut, Grüsse aus der Schweiz
        Stefan Ludwig

  2. Hallo,

    print $buchstabe, "\n";
    eingebaut.
    Nun kommt die Ausgabe aber erst, nachdem das ganze Script fertig ist, also alles auf einmal. Wie kann ich die Ausgabe zeitgenau "erzwingen"?

    Grundsätzlich müßest Du
    $ = 1;
    am Anfang des Scriptes einfügen. Das bewirkt nämlich, daß die Ausgaben sofort geschrieben werden, wenn sie erfolgen und nicht gepuffert. (Das hat was mit Perl-Internas Zu tun, genaueres fundest Du mit 'perldoc perlvar' raus.)

    So und dann gibt's noch ein zweites Problem. Wenn Du diese Ausgabe z.B. in den Netscape-Browser erfolgt, dann kommt das auch dann auf den Schirm, wenn es geschrieben wird, also 'zeitnah'. Wenn Du allerdings das Ganze mit dem IE machst, dnan hast Du schlechte Karten. Weil der wartet solange, bis die ganze seite da ist, bevor er sie ausgibt (afaik).

    Grüße
      Klaus

    1. hi Klaus,

      Wenn Du allerdings das Ganze mit dem IE machst, dnan hast Du schlechte Karten. Weil der wartet solange, bis die ganze seite da ist, bevor er sie ausgibt (afaik).

      Blöde Sache, das.
      Hab zwar tatsächlich vergessen, den Puffer auf 1 zu setzen, aber auch danach gibt es keine Änderung. Und rat mal, auf welcher Umgebung ich hier arbeiten muss...  :-(

      Beste Grüße
      Neo

      1. Hallo,

        Wenn Du allerdings das Ganze mit dem IE machst, dnan hast Du schlechte Karten. Weil der wartet solange, bis die ganze seite da ist, bevor er sie ausgibt (afaik).

        Blöde Sache, das.
        Hab zwar tatsächlich vergessen, den Puffer auf 1 zu setzen, aber auch danach gibt es keine Änderung. Und rat mal, auf welcher Umgebung ich hier arbeiten muss...  :-(

        Na vielleicht geht da was mit Javascript:

        <sample>
        #!/usr/bin/perl
        $=1;

        print <<EOT
        content-type: text/html

        <HTML>
        <BODY>
        EOT
        ;

        $text = "Bearbeitungsschritt: ";
        for $x ('a' .. 'z')
        {
        $text .= $x;
        print <<EOT
        <script language="JavaScript">
        status = '$text';
        </script>
        EOT
        ;
        sleep(1);
        }
        print <<EOT
        Fertig hurra
        </BODY>
        </HTML>
        EOT
        ;

        </sample>
        Hab ich im NN und IE 5 ausprobiert, das geht :-))

        Grüße
          Klaus

        1. Hallo Klaus,
          habs probiert, und es geht.
          Jetzt wird sogar dann, wenn die Status-Zeile geändert wird, auch der Fensterinhalt aktualisiert und meine "alten" Ausgaben erscheinen.
          Fein.
          Gute Idee. Danke.
          Neo

  3. Hi Neo!

    Bin in dieser Hinsicht nicht ganz sattelfest, aber such im Archiv mal nach "server push" (http://www.teamone.de/cgi-local/sfasuch.pl?suchausdruck=%2B"server+push"&case=on&feld=alle&hits=alle) und lies hier http://www.oreilly.de/catalog/perlmodger/manpage/cgi.htm#Server_Push nach. Vielleicht hilfts Dir weiter.

    Gruß Frank

  4. Hi Neo,

    cgi::push

    DESCRIPTION
    CGI::Push is a subclass of the CGI object created by CGI.pm. It is specialized for server push operations, which allow you to create animated pages whose content changes at regular intervals.

    You provide CGI::Push with a pointer to a subroutine that will draw one page. Every time your subroutine is called, it generates a new page. The contents of the page will be transmitted to the browser in such a way that it will replace what was there beforehand. The technique will work with HTML pages as well as with graphics files, allowing you to create animated GIFs.

    Ich denke, das ist die einfachste Lösung.

    Bye
    Timothy