免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4233 | 回复: 10
打印 上一主题 下一主题

perl中的时钟控制用什么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-02 13:14 |只看该作者 |倒序浏览
时钟控制应该用什么函数或模块?要求分别可以控制微妙、纳秒、秒、小时级别的时间!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2009-12-02 13:22 |只看该作者
问题不明确,给你几个关键字你自己搜索好了
time
select
alarm
Time::HiRes
POE

论坛徽章:
0
3 [报告]
发表于 2009-12-03 17:04 |只看该作者
原帖由 flw 于 2009-12-2 13:22 发表
问题不明确,给你几个关键字你自己搜索好了
time
select
alarm
Time::HiRes
POE



我的需求其实很简单,就是在windows下,我的程序可以隔几秒、几微妙、甚至几毫秒、几小时执行一个动作或语句。

根据我对你提的几个函数的分析,似乎Time::Hires可以用,这个模块里的usleep可以用,但是ualarm不能在windows下正常用。

下面是我看上面几个函数、模块的一点总结笔记和遗留问题,麻烦大家审审,解答下遗留问题,和指正下错误的地方?

Time()函数:
这个函数返回自“纪元”以来的没有润秒的秒数,是用于获得时间的吧?
Alarm()函数:
每次只能有一个定时器处于活跃状态。每次调用都关闭前面一个定时器,并且如果你给的 EXPR 是 0,那么就能取消所有前面设置的定时器而又不会启动一个新的定时器。它的返回值是前面一个定时器里剩下的时间的数量。
   print "Answer me within one minute, or die: ";
   alarm(60);         # 一分钟后终止程序
   $answer = ;
   $timeleft = alarm(0);   # 清除警报
   print "You had $timeleft seconds remaining\n";
把 alarm 和 sleep 混合在一起使用通常是一个错误,因为许多系统使用 alarm(2) 系统调用机制实现 sleep(3)。在老一些的系统上,流逝的时间可能比你声明的少上最多一秒钟,这是由于秒计数的方式造成的。另外,一台繁忙的系统可能无法立即运行你的进程。参阅第十六章获取关于信号处理的信息。

如果你需要比一秒的颗粒度更细的间隔,那么你可能要使用 syscall 函数访问 setitimer(2),前提是你的系统支持这个系统调用。CPAN 模块,Timer::HiRes,也提供了用于这个目的的函数。
Alarm()函数不能用在windows操作系统下!!?
Select()函数
select (RBITS, WBITS, EBITS, TIMEOUT),是用的最后一个TIMEOUT参数控制时间的吧,这个函数里面的任何一个参数都可以undef,如果TIMEOUT不是undef就是以秒计的吧,我想让它也可以小是毫秒、微妙、大是小时的单位。
Time::HiRes
Time::Hires里面的ualarm()函数似乎也不能在Win下正常用。还是说像CPAN上说的我的系统上没有ualarm函数,那就不能用。
我们的win系统上似乎是没有吧。
POE
POE似乎没有时间控制吧,怎么控制?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2009-12-03 17:07 |只看该作者
poe.perl.org
我认为它非常适合你。
当然了,它有些大。如果你的程序非常小的话,可能心里会觉得不值得。

但是,


如果换了是我,我一定用 POE。

论坛徽章:
0
5 [报告]
发表于 2009-12-03 17:46 |只看该作者
POE 有delay(), alarm()都是timer相关的,参考: POE::Kernel

论坛徽章:
0
6 [报告]
发表于 2009-12-03 20:44 |只看该作者
http://search.cpan.org/~roland/S ... ib/Schedule/Cron.pm,我用过很多次,还不错。

论坛徽章:
0
7 [报告]
发表于 2009-12-04 10:26 |只看该作者
原帖由 洲洲young 于 2009-12-2 13:14 发表
时钟控制应该用什么函数或模块?要求分别可以控制微妙、纳秒、秒、小时级别的时间!


斑竹写得比较高级,简单来说,如果我写带码的话,秒就用sleep(),更细的用select即可,你可以试着把select后的参数改为 1 0.5 0.1 0.01


  1. #!/usr/bin/perl
  2. $|=1;
  3. for(1..100){
  4.         select('','','',0.01);
  5.         print $_;
  6. }
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2009-12-04 14:14 |只看该作者
原帖由 xti9er 于 2009-12-4 10:26 发表


斑竹写得比较高级,简单来说,如果我写带码的话,秒就用sleep(),更细的用select即可,你可以试着把select后的参数改为 1 0.5 0.1 0.01


#!/usr/bin/perl
$|=1;
for(1..100){
        select('','','',0.01) ...

sleep 其实很不好。换了我,我肯定不会 sleep,而是 time time time time,和 sleep 相结合
crond 也是我这个思路……

论坛徽章:
0
9 [报告]
发表于 2009-12-04 17:13 |只看该作者
POE里面的alarm跟操作系统有关系吗,如果windows下没有alarm这个函数,那POE里面的alarm也不能用吧,跟Time::Hires一样。

论坛徽章:
0
10 [报告]
发表于 2009-12-04 17:17 |只看该作者
原帖由 洲洲young 于 2009-12-4 17:13 发表
POE里面的alarm跟操作系统有关系吗,如果windows下没有alarm这个函数,那POE里面的alarm也不能用吧,跟一样。


Time::Hires 在windows下能用
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP