Mark: 5 Sekunden auf BEnutzereingabe warten ansonsten weiter

Hallo,

ich frage in Perl eine Benutzereingabe ab (<STDIN>). Sollte diese nicht innerhalb einer gewissen Zeitdauer getätigt werden soll es im Script weitergehen.

Wie setzt man dies am Besten um?

Gruß

Mark

  1. Moin Moin!

    ich frage in Perl eine Benutzereingabe ab (<STDIN>). Sollte diese nicht innerhalb einer gewissen Zeitdauer getätigt werden soll es im Script weitergehen.

    perlfaq8/How to I timeout a slow event, perlipc/Signals.

    Haken: Das funktioniert unter Windows nur mit viel Glück, weil Windows keine Signale kennt. Das es überhaupt funktioniert, liegt daran, dass Perl Signale emuliert. Aber eben nicht perfekt.

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    1. perlfaq8/How to I timeout a slow event, perlipc/Signals.

      Haken: Das funktioniert unter Windows nur mit viel Glück, weil Windows keine Signale kennt. Das es überhaupt funktioniert, liegt daran, dass Perl Signale emuliert. Aber eben nicht perfekt.

      Alexander

      Hallo Alexander,

      Danke für Deine Antwort, aber irgendwie bin ich damit nicht so glücklich. Könnte man das ganze nicht ggf. mit Threads lösen?

      Gruß

      1. Moin Mark,

        Danke für Deine Antwort, aber irgendwie bin ich damit nicht so glücklich. Könnte man das ganze nicht ggf. mit Threads lösen?

        Theoretisch sicher. Wäre halt mit Kanonen auf Spatzen geschossen. Du kannst einen Thread starten, in dem das <STDIN> machen und im Haupt-Thread nach 5 Sekunden den <STDIN>-Thread canceln.

        Sinnvoller wäre allerdings entweder eine Lösung über select() (das ist auch der Weg, den man üblicherweise in C gehen würde) oder eine Lösung über alarm().

        LG,
         CK

        1. Sinnvoller wäre allerdings entweder eine Lösung über select() (das ist auch der Weg, den man üblicherweise in C gehen würde) oder eine Lösung über alarm().

          Hallo CK,

          mit select() komme ich nicht so ganz weiter:

          my $rin="";  
          my switch="";  
          vec($rin,fileno(STDIN),1)=1;  
            
          select($switch=$rin,undef,undef,5);
          

          Das macht schon fast was ich will. Nur gibt mir select den STDIN auch aus, das möchte ich nicht. Es soll ja nur in der Variable $switch stehen.

          Gruß

          1. So funktioniert es. Danke für Eure Anregungen.

            eval {  
              local $SIG{ALRM} = sub { die "alarm\n" };  
              alarm 5;  
              chomp($remark = <STDIN>);  
            };  
            alarm 0;
            
          2. Moin Mark,

            mit select() komme ich nicht so ganz weiter:

            my $rin="";

            my switch="";
            vec($rin,fileno(STDIN),1)=1;

            select($switch=$rin,undef,undef,5);

            
            >   
            > Das macht schon fast was ich will. Nur gibt mir select den STDIN auch aus, das möchte ich nicht. Es soll ja nur in der Variable $switch stehen.  
              
            Du musst selber noch lesen. Und an deiner Stelle würde ich auch IO::Select nehmen, das ist eine Abstraktion, die dir schon einiges abnimmt.  
              
            LG,  
             CK  
            
            -- 
            <http://ck.kennt-wayne.de/>