我编写了一个简单的脚本来管理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 );
单词等待直到完成..... 连续显示(不中断),我想读取像q
这样的键退出程序。
更新
我正在寻找一个尽可能多选项的解决方案,如果我只想退出程序,我只是告诉用户按Ctrl + C
在Perl中使用脚本可以吗?或不?如果是,怎么样?
注意:如果没有任何模块,请说出解决方案 没有任何模块,如果没有,没问题
但是,非常感谢你。
答案 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)
如果您不担心稍微延迟,可以使用select
和alarm
来尝试处理用户输入。
使用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);
参考文献: