八
26
本来想做一个按任意键结束程序的,但是没有能够实现,只好变成按回车或者输入键了。
在perl当中,要获取键盘输入,通常状态下是这样写的:
1 2 | my $getch = <STDIN>; chomp($getch); |
其中
当中getch()这类的接受一个字符的。所以就只好换按任意键结束为按回车键结束了。
我们假设需要实现的情况是这样子的,一个程序它需要反复运行,或者长时间运行,你需要一个类似于按Ctrl+C这样的,可以让它
随时终止的程序,这样以保证你的数据会正常的存盘。当然我知道你按Ctrl+C也会让程序flush内存,但是有些时候数据只处理到
一半,还需要再处理一下才输出到文件当中时,就需要你自己控制一下了。
大约的思路是,另开一个线程,让它一直处于等待状态,直到接受到回车为止,终结整个程序。我设计的程序本身是一个每隔15分
钟执行一次的,直到接受到回车为止。技巧有:
1. 使用单独的线程接受回车;
2. 使用线程间共享的控制变量;
3. 把主线程休眠的时间化整为零,这样才能让它每隔较短的时间就检查共享的控制变量有没有变化从而结束整个程序,否则它会等
待过长的时间来结束程序,这会引起使用者的误会。
原代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #!/usr/bin/perl use strict; use warnings; use Thread;#使用线程库 my $remark : shared;#要使线程间共享数据,需要在定义变量时加入shared标识。 my $in = threads->new (sub { #响应结束线程 $SIG{KILL} = sub { threads->exit(); }; # 等待输入 chomp ($remark = <STDIN>); }); print "press Enter to stop.\n"; while(not defined $remark) { #执行主程序 print "waiting for Enter to stop\n"; #化整为零,每隔1秒检查一次控制变量$remark是否有变化。 #没有就继续,有则退出; for(my $i=0; $i<900;$i++){ if(not defined $remark){ sleep 1; }else{$in->kill('KILL')->detach;#终止分线程 $i=900;#终止休眠 } } } |
转载请注明文章来自糗世界博客
