Schrift
[thread]10070[/thread]

alarm Funktion für Eingabe

Leser: 1


<< >> 5 Einträge, 1 Seite
mordur
 2007-08-14 11:43
#98110 #98110
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
moins,

ich habe mir mal perldoc -f alarm angeschaut und daraus folgendes kleines Beispielskript gebastelt:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
my $name=undef;

print "Name?: ";

eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
alarm 5;
$name = <STDIN>;
chop($name);
alarm 0;
};
if ($@) {
die unless $@ eq "alarm\n"; # propagate unexpected errors
print "\ndu hast nichts eingegeben!\n";
}
else {
print "\n Danke fuer den Namen: ".$name."\n";
}


Der Nutzer soll irgendwas eingeben und das Skript warte im Beispiel 5 Sekunden auf eine Eingabe. Die Alarmzeit läuft aber weiter, auch während der USer was eingibt. Wenn der Nutzer also ein sehr laaaaaangsamer Tipper ist, dann wird seine Eingabe vom Skript einfach unterbrochen. Ich könnte jetzt natürlich auch die Alarmzeit hochsetzen, aber dann könnte ich die alarm-Geschichte einfach ganz weglassen. Ziel ist es während einer Eingabe die alarmzeit zu verlängern und ansonsten eine bestimmte Zeit auf eine Eingabe zu warten und dann abzubrechen wenn keine Eingabe erfolgt.
renee
 2007-08-14 12:06
#98111 #98111
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du könntest versuchen mit CPAN:Term::ReadKey die einzelnen Tastatureingaben abzufangen und jedesmal den Alarm neu setzen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
murphy
 2007-08-14 12:59
#98115 #98115
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
In diesem Falle wäre es doch ganz einfach, vor dem Lesen der Eingabe einen select-Systemaufruf auf die Standardeingabe auszuführen. Läuft bei diesem Aufruf der eingestellte Timeout ab, so hat der Benutzer wohl nichts eingegeben, meldet der Aufruf bereitstehende Eingabedaten, so führt man einfach read aus, was dann solange zu lesen versucht, bis eine komplette Zeile eingeben wurde.

edit: Allerdings habe ich das gerade ausprobiert, und es scheint nicht wirklich wie gewünscht zu funktionieren: Selbst wenn man STDIN auf non-blocking schaltet und mit sysread liest, wartet select mit der Meldung, dass etwas zum Lesen von STDIN vorhanden ist, bis eine komplette Zeile eingegeben wurde. Wahrscheinlich muss man dann doch dem Terminal noch das zeilenweise Puffern abgewöhnen.
When C++ is your hammer, every problem looks like your thumb.
sid burn
 2007-08-14 13:24
#98116 #98116
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
murphy+2007-08-14 10:59:49--
In diesem Falle wäre es doch ganz einfach, vor dem Lesen der Eingabe einen select-Systemaufruf auf die Standardeingabe auszuführen. Läuft bei diesem Aufruf der eingestellte Timeout ab, so hat der Benutzer wohl nichts eingegeben, meldet der Aufruf bereitstehende Eingabedaten, so führt man einfach read aus, was dann solange zu lesen versucht, bis eine komplette Zeile eingeben wurde.

wenn der nutzer dann aber 1 Zeichen eingibt, und 3 Stunden nichts passiert, dann wartet das skript auch 3 stunden.

Ich denke der TE möchte einfach soetwas haben wie, wenn der Nutzer 10 sekunden lang keine Taste gedrückt hat, dann weiter machen. Wenn man natürlich eine taste drückt hat man wieder 10 sek zeit.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
mordur
 2007-08-14 14:04
#98118 #98118
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
Quote
Ich denke der TE möchte einfach soetwas haben wie, wenn der Nutzer 10 sekunden lang keine Taste gedrückt hat, dann weiter machen. Wenn man natürlich eine taste drückt hat man wieder 10 sek zeit.

exakt!

Gibt es wo verständliche Informationen zu Term::Readkey?
<< >> 5 Einträge, 1 Seite



View all threads created 2007-08-14 11:43.