Ausgabe des Bearbeitungsstandes waehrend das Script noch laeuft
Neo
- cgi
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
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
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
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
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
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! :-(((
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ß,
kerkiP.S.:
Ich hätte sie aber gern zeitnah ...
---------------------------^^^^^^^Mein Lieblingswort! :-(((
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
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
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
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
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
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
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
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