在流程运行时从键盘读取密钥

时间:2017-01-20 15:36:23

标签: perl keyboard stdin

我编写了一个简单的脚本来管理Linux-Gnu中带有 wl 的下载时间(开始和结束) Perl 。没有问题,一切都很好,除了我希望我可以在进程运行时从键盘读取一个键
我在屏幕上显示一个简单的动画动画,我不想停止它,然后读取键。

例如 mplayer mpv ,当您在comman-line上运行它时,可以按q退出或s从屏幕上拍照。

脚本的一部分:

do {
    system( "clear" );
    ($h, $m, $s) = k5mt::second_to_clock(  $till_shutdown );

    set_screen();
    set_screen( 24 );

    set_screen();
    say "download was started ...";

    set_screen();
    set_screen( 24 );

    set_screen();
    printf "till finish:    %02d %02d %02d\n", $h, $m, $s;

    set_screen();
    set_screen( 24 );

    set_screen();
    say "wget pid: [$wget_pid]";

    set_screen();
    set_screen( 24 );

    set_screen();
    $waiting_temp .= $animation[ $counter_animation++ ];
    say $waiting_temp;
    if( length( $waiting ) == $counter_animation ){
        $waiting_temp = "";
        $counter_animation = 0;
    }

    set_screen();
    set_screen( 24 );

    sleep 1;
    $till_shutdown--;

} while( $till_shutdown );  

enter image description here

单词等待直到完成..... 连续显示(不中断),我想读取像q这样的键退出程序。

更新

我正在寻找一个尽可能多选项的解决方案,如果我只想退出程序,我只是告诉用户按Ctrl + C

在Perl中使用脚本可以吗?或不?如果是,怎么样?

  

注意:如果没有任何模块,请说出解决方案   没有任何模块,如果没有,没问题

但是,非常感谢你。

3 个答案:

答案 0 :(得分:2)

假设您的程序有一个中央循环,或者您只需将键盘检查放入处理中,那么最好使用Term::ReadKey而不是尝试适应fork并处理必要的进程间通信

调用ReadKey(-1)将执行非阻塞读取,如果键已被命中,则返回单个字符,否则返回undef。 (您可以提供第二个参数,即要使用的IO通道,但默认为STDIN。)

我建议你运行这个例子。我使用sleep 1作为循环处理的假人

use strict;
use warnings 'all';
use feature 'say';

use Term::ReadKey;

my $n;

while () {

    my $key = ReadKey(-1);

    say "key $key entered" if defined $key;

    sleep 1;

    say ++$n;
}

答案 1 :(得分:-1)

如果您不担心稍微延迟,可以使用selectalarm来尝试处理用户输入。

使用select您可以处理STDIN并使用alarm您可以等待几秒或更短的时间来进行用户输入。

#!/usr/bin/env perl 

use common::sense;

use IO::Select;

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

$|++;

my $running = 1;

while ($running) {

    eval {

        local $SIG{ALRM} = sub { die 'Time Out'; };

        alarm 0.5;

        if ( $sel->can_read(0) ) {

            my $input = <STDIN>;

            chomp $input;

            print "STDIN > $input\n";

            $running = 0;

        }
    };

    if ( !$@ ) {

        select( undef, undef, undef, 0.5 );

        print ".";

    }
}

print "\nEnd Of Script\n";

我告诉过你尝试使用Term :: ReadKey: - )

我们走了:

!/usr/bin/env perl 

use common::sense;
use Term::ReadKey;

my $running = 1;
my $key;

while ($running) {
    ReadMode 4;    # Turn off controls keys
    while ( not defined( $key = ReadKey(-1) ) ) {

        select( undef, undef, undef, 0.5 );

        print '.';

    }
    print "\nSTDIN> $key\n";
    ReadMode 0;  

}

print "\nEnd Of Script\n";

现在你只需要处理quit或int之类的信号来退出循环,但是使用它可以捕获输入并做你想做的任何事情。

答案 2 :(得分:-1)

这对你有用

Bitmap bmp = BitmapFactory.decodeFile(source);
Bitmap bmOverlay = Bitmap.createBitmap(bmp.getWidth(),bmp.getHeight(),bmp.getConfig());
Canvas canvas = new Canvas(bmOverlay);

参考文献: