Aquariophile: Schleife in Schleife?

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

  1. 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

    1. 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

  2. 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

    1. 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

  3. 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

    1. 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

      1. 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

        1. 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

        2. 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)

      2. 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

        1. 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

          1. 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

      3. 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

        Online-Script ohne Pufferung, zeigt Einzelschritte an.

        Funktioniert nicht mit Proxys wie WebWasher.

        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