Schleife in Schleife?
Aquariophile
- perl
0 CaptainSolo0 Bio0 Sven Rautenberg0 Aquariophile0 Bio0 Klaus Mock0 Sven Rautenberg
Anrede: Hallo Menschen!
Vorhanden: Eine WHILE-Schleife
(Siehe unten)
while (<$data>) { print $_."\n"; }
Problem: In diese While-Schleife muss was rein,
das alle 60 Sekunden $t++; macht und
danach $t ausgibt.
Meine Idee: Leider keine gute,
ich stellte nur fest,
dass Schleife in Schleife nicht ist...
Sonst wär's ja einfach,
einfach eine schleife und ein
sleep 60; rein...
Einschleimen: Uuuur Lieb dass Du mir hilfst!! ;-))
Grußformel: LG,
Aquariophile
H
a
l
l
o
D
u
!
Hast
Du
irgendein
Problem
mit
Deiner
Return
Taste
?!
:o))
Du kannst die Anweisung des "t++" doch auch in die while-Bedingung nehmen oder?
Gruss,
CS
Hallo!
grr!
Ich habs gewusst dass da eine Verarsche kommt *gggg*
Das passiert mir mit Opera,
wenn man einmal sendet,
dann aber ein Fehler kommt (in diesem Fall "Thema" zu lang)
und man erneut "senden" drücken muss.
Dann hat die Textarea irgendwie ein \n Problem,
zumindest mit Opera aber mit NN auch wie sich herausstellte.
-----
So, und $t++; kann ich nicht in den selben socket tun.
Der socket liefert in uregelmäßigen abständen neeue Daten und die müssen immer sofort ankommen,
und $t++; soll alle 60 sek. kommen.
LG
Aquariophile
Sup!
while (<$data>) { print $_."\n"; }
Warum soll denn while (<$data>) {print $_."\n"; sleep 60;} nicht gehen?
Koennte hoechstens Probleme geben mit dem Timeout, nicht jeder Socket bleibt einfach unbegrenzt lange offen, wenn man nichts raus liest.
CK wuerde sicher vorschlagen, IO::Socket und IO::Select zu benutzen.
Gruesse,
Bio
Hoi,
CK wuerde sicher vorschlagen, IO::Socket und IO::Select zu benutzen.
Ich wuerde vorschlagen, alarm() und $SIG zu benutzen:
$SIG{ALRM} = &do_alarm;
alarm(60);
sub do_alarm() {
print "ausgabe";
alarm(60);
}
Gruesse,
CK
Moin!
Problem: In diese While-Schleife muss was rein,
das alle 60 Sekunden $t++; macht und
danach $t ausgibt.
Laß mich raten: Du willst die Minuten zählen, die bei der Ausgabe vergangen sind?
Warum dann nicht vor der Schleife und hinterher die Zeit des Rechners nehmen und vergleichen bzw. voneinander abziehen?
Perl bietet mit der Funktion "time" eine Möglichkeit, sekundengenau zu zählen (das ist die Unix-Uhr). Sollte für deine Belange allemal reichen. Also
$start=time();
while...
$stop=time();
$runtime=$stop-$start;
$t=int($runtime/60);
- Sven Rautenberg
Hi Sven
Ganz lieb aber das bringt auch nix.
Der muss alle 60 sek was ausgeben
(damit der Browser den Stream nicht abbricht)
LG
Aquariophile
Sup!
Ganz lieb aber das bringt auch nix.
Der muss alle 60 sek was ausgeben
(damit der Browser den Stream nicht abbricht)
Aber manche Browser rendern doch gar nicht erst, wenn das Laden noch nicht zu Ende ist...?
Gruesse,
Bio
Hi Bio
was meinst Du mit "rendern" ?
Der Stream hängt sich (dank des Browsers) auf wenn circa 60 sekunden lange nix neues kommt.
LG
Aquariophile
Sup!
ply me the information, please ...
Aber manche Browser rendern doch gar nicht erst,
wenn das Laden noch nicht zu Ende ist...?
welche? Das würde ja meinen Glauben an die inkrementelle Darstellung von HTML-Dokumenten massiv erschüttern.
Viele Grüße
Michael
(der natürlich unvollständig übertragene <table>s etc. im obigen Sinne nicht meint)
Hallo,
Ganz lieb aber das bringt auch nix.
Der muss alle 60 sek was ausgeben
Dann kannst Du doch auch 'time' in der Schleife aufrufen, und wenn die Minute um ist, etwas ausgeben.
my $starttime = time;
while(...)
{
print '.' unless ((time() - $starttime)%60);
[...]
}
(ungetestet)
(damit der Browser den Stream nicht abbricht)
hmm, eigenartig, ich habe auch schon mal scripts geschrieben, welche eventuell länger gelaufen sind (10-15 min) und habe mit üblichen Browsern kein Problem gehabt.
Allerdings habe ich da den Servertimeout hochgedreht.
Grüße
Klaus
Hallo Klaus!
aber dann ist es ja dennoch schleife in schleife,
weil er muss ja alle 60 sek was printen und das kann ich nur in Shcleifenform definieren
egal ob mit oder ohne time?
Danke
Aquariophile
Hallo,
aber dann ist es ja dennoch schleife in schleife,
Abgesehen davon, daß nichts gegen verschachtelte Schleifen spricht, sehe ich da nirgendwo eine zweite Schleife.
weil er muss ja alle 60 sek was printen und das kann ich nur in Shcleifenform definieren
egal ob mit oder ohne time?
Nein, es wird nur etwas ausgegeben, wenn eine bestimmte Bedingung erfüllt ist, also 'unless(...);'.
Und Bedingungen sind definitiv _keine_ Schleifen!
'time' ist eine Funktion, welche die Anzahl der Sekunden seit 'the epoch' ermittelt, und wartet nicht etwa, daß eine bestimmte Zeit verstreicht. Das passiert mit sleep.
Grüße
Klaus
Hi Sven
Ganz lieb aber das bringt auch nix.
Der muss alle 60 sek was ausgeben
(damit der Browser den Stream nicht abbricht)
Ich habe mir mal ein Perl-Skript geschrieben, welches per Modem online geht. Dazu habe ich auch einen Fortschrittsbalken gebastelt, der solange fortschreitet, wie das Modem wählt, synchronisiert, verbindet und den PPP-Link herstellt
Folgender Script-Teil hat das realisiert:
$tout = time + 120;
print "Wähle Freenet-Nummer. Warte auf Verbindung:<BR>\n";
print "<IMG SRC="/balken.jpg" alt=""><BR>\n";
/usr/bin/wvdial > /var/log/wvdial.log 2>&1 &
;
$oldtime=0;
until (($_ =~ /ppp/) || (time > $tout))
{ while ($oldtime>time){}
$_=ifconfig|grep ppp
;
$oldtime=time+2;
print "<IMG SRC="/progress.gif" alt="">";
}
Das Script läuft unter Apache. Damit der Trick mit dem Fortschrittsbalken auch sichtbar funktioniert, mußt du das Script vorne mit "nph-" benennen und am Anfang einen kompletten HTTP-Header ausgeben:
#!/usr/bin/perl -w
use FileHandle;
STDOUT-> autoflush (1);
print "HTTP/1.0 200 Okay\n";
print "Content-type: text/html\n\n";
Mag sein, daß da noch der eine oder andere Unsinn drin ist (so genau habe ich mich da nicht eingelesen), aber es funktioniert bei mir (jetzt dank DSL nicht mehr <s>).
Grundsätzlich: Die Lösung deines Problems kann auch darin bestehen, die Sichtweise komplett umzukehren: Warte nicht auf Zeichen vom Socket und laß unter Umständen mal alle Minute was zusätzlich printen, sondern drucke jede Minute was, und zwischendurch dann eventuell noch das vom Socket (oder woher auch immer deine Eingabe kommt).
- Sven Rautenberg