Tek: Warteschleife spinnt - oder Perl kann nicht zählen...

Hallo.

Mal unabhängig vom Programmierstil (ist eh noch Beta), schaut och doch mal bitte das folgende Script an:

Haupt :

$timeout = localtime();
    if ($timeout =~ /06:55/ $timeout =~ /06:56/ $timeout =~ /07:/) {
       &time_out;
   }

viele andere Zeilen !!! ;-)

sub time_out {

$timeout = localtime();

while ($end ne "1") {        
           if ($timeout  =~ /21:/) { $end = 1; }
           else { $timeout = localtime();  $end = 0;     }
       }
       goto Haupt;
}

Nun, das Script sollte sich jedenfalls zu einer bestimmten Uhrzeit (ca 06:55 - 07:00) selbst deaktivieren, bzw in die Timeoutschleife katapultieren.

In der Timoutschleife wird die Uhrzeit 21:00 erwartet, um dann anschließend das Programm wieder erneut zu starten (goto Haupt).

So weit so gut, Das Script startet......läuft durch.......macht und tut....setzt um 07:00 Uhr in die Time_out Schleife aus......und startet 1,5 - 2 Stunden später wieder von neuem ...??Häh?

In 2 Stunden?

Wer kann helfen?

Danke.

  1. Ein Fehler könnte sein, daß wenn $end einmal auf 1 gesetzt wurde, es nie wieder auf 0 kommen kann!

    Reiner

    1. Negativ !

      Ich habe bereits Wahnvorstellungen. daß ein Perlscript sich nach einer bestimmten Anzahl
      gleicher Schleifen killt (oder so) ...

      $end kommt mit 0 bereits in die while-Schleife hinein ! Und soll nur einmal auf 1 gesetz werden...aber nicht schon nach 2 Stunden........07 Uhr bis 21 Uhr sind wohl ‚n bisschen mehr!

      Ein Fehler könnte sein, daß wenn $end einmal auf 1 gesetzt wurde, es nie wieder auf 0 kommen kann!

      Reiner

      1. Wäre es vielleicht eine Lösung, einfach "sleep <sekunden>" zu nutzen?

  2. Hallo,

    In der Timoutschleife wird die Uhrzeit 21:00 erwartet, um dann anschließend das Programm wieder erneut zu starten (goto Haupt).

    So weit so gut, Das Script startet......läuft durch.......macht und tut....setzt um 07:00 Uhr in die Time_out Schleife aus......und startet 1,5 - 2 Stunden später wieder von neuem ...??Häh?

    dazu gleich mal ne Frage: Wie sieht der Time-String aus, den Localtime liefert? Werden nur Stunden und Minuten oder auch noch Sekunden (z.B. gerade "17:11:18") geliefert? Ich vermute mal stark, daß die Sekunden auch mit ausgegeben werden, siehe z.B. <../../tgcl.htm>. Für den Fall versuch ich jetzt mal spaßeshalber, das ganze zu rekonstruieren <g>:

    • um 6:55:00 oder so wird vom Hauptprogramm in sub timeout { .. } gesprungen.
    • dort wird so lange eine while-Schleife durchlaufen, bis der Teilstring "21:" in $localtime vorkommt. Das dürfte z.B. um 7:21:00 Uhr passieren!
    • Mittels goto wird wieder in das Hauptprg. (Label haupt:) gesprungen (was nebenbei unüblich ist, aus subroutinen mit goto auszusteigen).
    • Dort wird aber sofort wieder der Teilstring "7:" in $localtime gefunden, da es ja 7:21:00 ist - und wieder in die Subroutine gesprungen.
    • Erst um 8:21:00 (das 2. mal mit "21:" innerhalb von $localtime) kann dann das Hauptprogramm fortgesetzt werden, also ca. 1 1/2 Stunden später.

    Kann das Deine Beobachtungen erklären?

    Viele Grüße

    Andreas

  3. FEHLER GEFUNDEN!!!!!

    while ($end ne "1") {        
               if ($timeout  =~ /21:/) { $end = 1; }

    Hier MÖCHTE ich prüfen, ob es bereits 21:00 Uhr ist....

    Na ja, $timeout enthält aber den Wert von localtime()
    also
    $timeout  => Wed 8 Aug 00:00:00 1999
    (wobei 00:00:00 der aktuellen Uhrzeit entspricht).

    Somit prüft meine Abfrage folgenden:

    Entweder 21:00:00 oder 00:21:00
    (21: kommt in beiden fällen vor !)

    Richtig müßte es also lauten   >            if ($timeout  =~ /21:00:/) { $end = 1; }
    ...wenn schon 21:00 Uhr!

    Trotzdem allen ein Dankeschön!