Schrift
[thread]9197[/thread]

windows und alarm() bzw select...



<< >> 9 Einträge, 1 Seite
the-loader
 2007-07-17 14:16
#78540 #78540
User since
2006-08-28
25 Artikel
BenutzerIn
[default_avatar]
Hallo @all
Ich habe ein sehr großes problem und hoffe das ihr mir weiterhelfen könnt...

nach meinen aktuellen Kenntnisstand ist es unter windows mit perl nicht möglich eine Operation nach einer Bestimmten Zeit abzubrechen.

So weit ich weis ist alarm und select nur unter Linux möglich, jedoch nicht unter windows.
auch mehrere tests von meiner seite haben leider das gleiche ausgesagt...
gibt es also gar keine möglichkeit unter windows eine opperation nach einer bestimmten zeit abzubrechen? ich würde mich ja auch mit einen Provisorium zufrieden geben.

ich hoffe auf jede Hilfe.

Danke
sid burn
 2007-07-17 14:27
#78541 #78541
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
alarm geht unter Windows meine ich seit Perl 5.8. Welche Version hast du?

Bzw. welchen Code hast du zum Testen genutzt?

Normalerweise geht z.B. soetwas:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl
use strict;
use warnings;

alarm(10);
my $input;
eval {
    local $SIG{ALRM} = sub { die "alarm\n" };
    print "Bitte etwas eingeben: ";
    $input = <STDIN>;
    alarm(0);
};
chomp $input;

if ($@) {
    print "Timeout beim Einlesen\n" if $@ =~ m/^alarm/;
    exit 1;
}
else {
    print qq(User hat "$input" eingegeben.\n);
}
\n\n

<!--EDIT|sid burn|1184668160-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
sid burn
 2007-07-17 14:41
#78542 #78542
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Unter Umständen geht auch "select".
Läuft jedenfalls unter GNU/Linux bei mir ohne Probleme.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/perl
use strict;
use warnings;
use IO::Select;
use IO::Handle;

my $select = IO::Select->new;
$select->add( \*STDIN );

STDIN->blocking(0);
STDOUT->autoflush(1);

print "Bitte etwas eingeben: ";
if ( my @ready = $select->can_read(10) ) {
    for my $fh ( @ready ) {
        while ( my $line = <$fh> ) {
            chomp $line;
            print "Empfangen: $line\n";
        }
    }
}
else {
    print "Timeout\n";
}
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
the-loader
 2007-07-17 14:41
#78543 #78543
User since
2006-08-28
25 Artikel
BenutzerIn
[default_avatar]
This is perl, v5.8.8 built for MSWin32-x86-multi-thread
(with 25 registered patches, see perl -V for more detail)

Copyright 1987-2006, Larry Wall

Binary build 817 [257965] provided by ActiveState http://www.ActiveState.com
Built Mar 20 2006 17:54:25

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.



mit den script genau so wie es oben steht bricht er nicht ab (ich kann es 10min laufen lassen)
bei einen kumepl habe ich es auch getestet... das gleiche ergebniss
the-loader
 2007-07-17 14:46
#78544 #78544
User since
2006-08-28
25 Artikel
BenutzerIn
[default_avatar]
bei select bricht er sofort mit timeout ab (er gibt mir keine Gelegenheit zur eingabe
nepos
 2007-07-17 15:02
#78545 #78545
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
IO::Select klappt laut dem, was ich bei Perl Monks gelesen habe nur, wenn es sich um einen Socket handelt. Bei Dateien geht es nicht.
Siehe auch: http://www.perlmonks.org/?node_id=46021

perlport bestätigt dies nochmals:
Quote
select Only implemented on sockets. (Win32, VMS)


@Sid-burn: Es ging ja hier explizit um Windows. Dass es unter Linux/Unix klappt, stand ja nicht zur Debatte :)\n\n

<!--EDIT|nepos|1184670195-->
sid burn
 2007-07-17 15:32
#78546 #78546
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=nepos,17.July.2007, 13:02]@Sid-burn: Es ging ja hier explizit um Windows. Dass es unter Linux/Unix klappt, stand ja nicht zur Debatte :)[/quote]
Schon klar, nur habe ich hier kein Windows System um den Code zu testen. Und vor deinem Post wuste ich nicht das IO::Select lediglich für Sockets implementiert wurde.

Deswegen schrieb ich halte das es unter Linux klappt. Unter Windows muss er dann selber nochmal testen.

----------

Um zum Thema zurück zu kommen. Da fällt mir zur Zeit sonst nichts anderes mehr ein.

Aber eigentlich müsste alarm gehen. Habe es selber meine ich schon unter Windows mal ausprobiert und es ging.

Vielleicht könnte man ja etwas mit fork() bzw unter Windows dann eher etwas mit Threads machen. Wüste aber auch nicht wie ich es genau anstellen würde.

P.S.: Wie kann man bloß freiwillig unter Windows Coden? ;)
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
sid burn
 2007-07-17 15:56
#78547 #78547
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
*hust*
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl
use strict;
use warnings;
use IO::Handle;

STDIN->blocking(0);

print "Bitte etwas eingeben: ";
my $input;
for( 0 .. 100 ) {
    $input = <STDIN>;
    select undef, undef, undef, 0.1;
    last if $input;
}

if ( $input ) {
    chomp $input;
    print qq(User hat $input eingegeben\n);
}
else {
    print qq(Timeout\n);
}


Naja ist ja nur Spaß! ;)
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
the-loader
 2007-07-17 17:30
#78548 #78548
User since
2006-08-28
25 Artikel
BenutzerIn
[default_avatar]
leider geht nicht mal diese abenteuerliche möglichkeit
<< >> 9 Einträge, 1 Seite



View all threads created 2007-07-17 14:16.