Schrift
[thread]6288[/thread]

Tastaturabfrage - muß immer Enter drücken: mit select oder ReadKey

Leser: 1


<< >> 10 Einträge, 1 Seite
solder
 2004-05-25 00:56
#82701 #82701
User since
2004-05-25
5 Artikel
BenutzerIn
[default_avatar]
Hallo,

irgendwie schaffe ich es nicht eine Tastaturabfrage so zu machen, daß ich nur eine Taste drücken muß (ohne Enter hinterher). Ich habe schon verschiedenen Code (auch aus dem Forum) probiert, es geht nicht. Ich würd's gern mit Select machen, da später noch andere Eingabekanäle hinzukommen. Die Abfrage soll aber nur ein kleines Timeout haben, da ich auch noch auf eine PID testen muß. So sieht einer meiner Versuche aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
$pid = open (OUT, "| mplayer /Server/video/video.avi 2>/dev/null 1>/dev/null ") or die "geht nicht";

OUT->autoflush(1);
while (!waitpid($pid,WNOHANG)) {
$|=1;
vec( my $in, fileno(STDIN), 1 ) = 1;
if ( select( $in, undef, undef, 1 ) ) {
my $input = <STDIN>;
print OUT "$input";
}
}

close OUT;


Ich hab' keine Idee mehr. Ihr? Danke schon mal für's ansehen ;-)

Solder
Ich verwende Perl 5.8.x unter SuSE Linux oder Debian Sarge
Projekte: Perl für Apache/MySQL-CGI (funktioniert wunderbar)
Jukebox-Projekt (große Baustelle).
solder
 2004-05-25 12:22
#82702 #82702
User since
2004-05-25
5 Artikel
BenutzerIn
[default_avatar]
Hallo, leider kann man keine geschriebenen Artikel später editieren :(

Ich habe mir meinen eigenen Text noch mal durchgelesen und festgestellt, daß ich das nicht so eindeutig geschrieben habe:

select wartet durchaus nur solange bis das Timeout abläuft. Drücke ich in dieser Zeit eine Taste, so erscheint der Buchstabe in der Konsole, aber select bricht nicht ab, nur wenn ich zusätzlich auch Enter drücke bricht select ab und auch nur dann bekomme ich von <STDIN> etwas zurück. Auch beim select aus IO::Select ist es nicht anders und bei Term::ReadKey funktionierts nur, wenn Readkey auf die Taste wartet, was ich aber nicht gebrauchen kann, weil ich ja noch die PID testen muß.

Solder
Ich verwende Perl 5.8.x unter SuSE Linux oder Debian Sarge
Projekte: Perl für Apache/MySQL-CGI (funktioniert wunderbar)
Jukebox-Projekt (große Baustelle).
sri
 2004-05-25 12:26
#82703 #82703
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Versuchs einfach mal non-blocking.

perldoc -f sysread\n\n

<!--EDIT|sri|1085473820-->
Crian
 2004-05-25 12:42
#82704 #82704
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
[quote=solder,25.05.2004, 10:22]Hallo, leider kann man keine geschriebenen Artikel später editieren  :([/quote]
Was meinst Du wohl, wofür der Schalter "Beitrag ändern" rechts oben über Deinen Beiträgen gut ist? ;)\n\n

<!--EDIT|Crian|1085474539-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
solder
 2004-05-25 13:04
#82705 #82705
User since
2004-05-25
5 Artikel
BenutzerIn
[default_avatar]
Hallo,

Quote
Was meinst Du wohl, wofür der Schalter "Beitrag ändern" rechts oben über Deinen Beiträgen gut ist? ;)


Bei mir war der aber nicht da - aber klar, da war ich doch noch nicht angemeldet... Und ich hab' bestimmt 3x gesucht...

Nichts desto trotz funktioniert das bei mir nicht so richtig. Eure Vorschläge werde ich heute Nachmittag mal probieren, wenn ich wieder zu Hause bin.
Hab' übrigens auch das (Perlfaq8) und den nachfolgenden Artikel probiert. Manchmal hatte ich den Eindruck, daß es genau einmal funktioniert und dann nicht mehr. Das war aber irgendwie nicht reproduzierbar. Könnte sich was verstellen, wenn man das Programm mit CTRL+C abbricht, so daß diese Tastaturabfrage danach nicht mehr funktioniert?

Solder
Ich verwende Perl 5.8.x unter SuSE Linux oder Debian Sarge
Projekte: Perl für Apache/MySQL-CGI (funktioniert wunderbar)
Jukebox-Projekt (große Baustelle).
Crian
 2004-05-25 13:13
#82706 #82706
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
[quote=solder,25.05.2004, 11:04]
Quote
Was meinst Du wohl, wofür der Schalter "Beitrag ändern" rechts oben über Deinen Beiträgen gut ist? ;)


Bei mir war der aber nicht da - aber klar, da war ich doch noch nicht angemeldet... Und ich hab' bestimmt 3x gesucht...[/quote]
Wär wohl auch keine gute Idee, wenn jeder Gast die Beiträge aller anderen Gäste editieren könnte :D ;)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
solder
 2004-05-25 19:26
#82707 #82707
User since
2004-05-25
5 Artikel
BenutzerIn
[default_avatar]
Hallo nochmal,

So, ich hab's jetzt noch mal mit einem ganz einfachen Programm versucht:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl -w

use Term::ReadKey;
use strict;

for (my $i=0;$i<10;$i++) {
sleep 2;
ReadMode('cbreak');
if (defined (my $char = ReadKey(-1)) ) {
print "Das Zeichen war $char\n";
} else {
print "nichts gedrückt\n";
}
ReadMode('normal');
}
sleep 3;

Was passiert? Wenn man nach dem Start gleich eine Taste drückt und dann immer wieder, so funktioniert alles. Drückt man jedoch bei einem Durchlauf keine Taste so funktioniert es von da an nie wieder. Warum? Bin ziemlich ratlos

Solder :angry:
Ich verwende Perl 5.8.x unter SuSE Linux oder Debian Sarge
Projekte: Perl für Apache/MySQL-CGI (funktioniert wunderbar)
Jukebox-Projekt (große Baustelle).
esskar
 2004-05-26 05:21
#82708 #82708
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Habe auch das Problem unter Win32;
ich denke mal, dass das restore nicht wirklich das tut, was es soll!
Falls du Win32 benutzt, ist wohl Term::Getch eine sehr gute alternative!
solder
 2004-05-26 12:06
#82709 #82709
User since
2004-05-25
5 Artikel
BenutzerIn
[default_avatar]
Hallo,

Quote
Falls du Win32 benutzt, ist wohl Term::Getch eine sehr gute alternative!


Leider nicht. Das Programm soll unter Linux laufen.

Ich habe die Versuche jetzt abgebrochen. Es wäre ohnehin nur ein Zwischenschritt gewesen. Benutze jetzt Tk, da habe ich dann gleich ein kleines Progrämmchen auf dem Bildschirm und zusätzlich zu den Mouse-Buttons kann ich auch Tasten definieren, die eine Aktion auslösen. Das funktioniert wunderbar. In der FAQ hier habe ich gefunden, wie ich eine Schleife mache, die die anderen Eingabe-Kanäle abfangen kann - zumindest die Abfrage nach der PID funktioniert schon mal sehr gut.

Solder
Ich verwende Perl 5.8.x unter SuSE Linux oder Debian Sarge
Projekte: Perl für Apache/MySQL-CGI (funktioniert wunderbar)
Jukebox-Projekt (große Baustelle).
betterworld
 2004-05-26 15:57
#82710 #82710
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Code: (dl )
`stty -icanon`

(unter Linux)
Anwendungsbeispiel:
Code: (dl )
$ perl -le '`stty -icanon`;print "uh $_ oh\n" while $_=getc();`stty icanon`'
\n\n

<!--EDIT|betterworld|1085572683-->
<< >> 10 Einträge, 1 Seite



View all threads created 2004-05-25 00:56.