package MyTime; use Common; @ISA = qw(Common); use strict; if($^O eq 'MSWin32') { use Win32; } #=============================================== # コンストラクタ、デストラクタ #=============================================== sub new { my ($module) = @_; my $this = {}; bless $this; $this->{StartTime} = time(); if($^O eq 'MSWin32') { $this->{StartGetTickCount} = Win32::GetTickCount(); } return $this; } sub DESTROY { my $this = shift; $this->SUPER::DESTROY(@_); } #=============================================== # 一般関数 #=============================================== # Win32::GetTickCountを使い、$StartTimeからの経過時間を返す # 49日を経過したときの対策として、$timeが負になったときは2^32 msecを加えている # これで最低49日、Windows起動直後からプログラムを実行した場合は98日程度まで使える sub GetTime { my ($this, $SubtractStartTime) = @_; $SubtractStartTime = 0 if(!defined $SubtractStartTime); if($^O eq 'MSWin32') { my $now = Win32::GetTickCount(); my $passed = $now - $this->{StartGetTickCount}; if($passed >= 0.0) { return $passed * 0.001 if($SubtractStartTime); return $now * 0.001; } else { my $nowtime = time(); my $n = int( ($nowtime - $this->{StartTime}) / 4294967.296 + 0.001); $now = $now * 0.001 + 4294967.296 * $n; return ($now - $this->{StartGetTickCount} * 0.001) if($SubtractStartTime); return $now; } } else { return time() - $this->{StartTime} if($SubtractStartTime); return time(); } } 1;