Perl - CPAN - Time::HiResパッケージ
ここに掲載するものは、塚本さんにパッケージ化して頂いているZaurus用Perl 5.6.1に追加でインストールするPerlライブラリのTime::Hiresである。
ソースはここからダウンロードし、dev-img-1.3でセルフコンパイルした。
gcc 2.95はコードオプティマイズにバグを含んでいると言う話を聞いているので、Makefileからオプティマイズオプションを外してビルドした。
download:lib-perl-time-hires_1.86-1_arm.ipk
手始めの使い方は以下の通りである。
# 1.2秒待つ use Time::HiRes qw(usleep); usleep(1200000); # マイクロ秒(100万分の1秒)
# 2.7秒間のキー入力を待つ use Time::HiRes qw(gettimeofday tv_interval); use Term::ReadKey; ReadMode(4); print "hit any key ... "; undef $key; @curtm = gettimeofday; while (tv_interval(\@curtm) < 2.7) { $key = ReadKey(-1); if (defined($key)) { last; } } ReadMode(0); if (defined($key)) { print "press '$key'\n"; } else { print "no key\n"; }
# 5.3秒間に0.8秒毎のシグナルを受信する use Time::HiRes qw(usleep ualarm gettimeofday tv_interval); sub showtime { $t = gettimeofday; print $t, "\n"; } $SIG{ALRM} = "showtime"; showtime; # 開始時間を表示 ualarm(800000, 800000); @curtm = gettimeofday; # 以下のwhileループについては※1を参照 while (($rel = 5.3 - tv_interval(\@curtm)) > 0) { usleep(int($rel * 1000000)); } showtime; # 終了時間を表示
※1:本当は "usleep(5300000);" で済むはずだが、このバージョンのPerlではusleep内でシグナルが発生すると、残りの待ち時間があったとしてもusleepが終了してしまうため、別の方法で正確な時間を取らなければならない。
Zaurusではclock_gettime,clock_getres,clock_nanosleepはサポートしていない。
また、setitimerではITIMER_REALのみをサポートしている。
Time::HiResの詳細は以下をご覧頂きたい。
英語:http://search.cpan.org/~jhi/Time-HiRes-1.9705/HiRes.pm
日本語:http://perldoc.jp/docs/modules/Time-HiRes-1.55/HiRes.pod