4D-jp 4D Japan Technical Support Team

Milliseconds ドキュメント追記


Milliseconds の例題と説明文が改定されています。経過時間を計測したい場合,関数から返される値を比較するのではなく,差を計算するべきである点が強調されています。値は約24日毎に符号が反転するからです。

Millisecondsは,マシン(アプリケーションではありません)が起動されてから経過された時間をミリ秒単位で返します。しばしば時間の計測に使用される関数ですが,符号付き32ビット整数(C_LONGINT)が使用されているため,2147483647ミリ秒,つまり約24.86日毎に返される値の符号が反転することに留意しなければなりません。

経過時間(たとえばプロセスの停止時間)を計測するような場合,Milliseconds+$timeoutのような加算式でタイムアウト時間を計算するべきではありません。そうではなく,必ずMillisecondsの差と閾値を比較するようにしてください。

たとえば,MAXLONG (2147483647)1を加算すると,-2147483648になります。比較演算で処理した場合,時間が過去に戻ったような扱いになり,(24日後まで)タイムアウト条件が満たされません。対照的に,値の差を計算すれば,つまり-2147483648-MAXLONGを求めれば,(整数の符号がまた反転して)1が返されます。

ドキュメントは17r3で改定されていますが,この情報は過去すべてのバージョンで有効です。

  • 改定されたサンプルコード 17r3
 If(Locked([Table_1]))
    $starttime:=Milliseconds
    Repeat
       DELAY PROCESS(Current process;15)
       LOAD RECORD([Table_1])
       $waittime:=Milliseconds-$starttime
    Until(Not(Locked([Table_1]))|(Process aborted)|($waittime>5000)) //最大で5秒待つ
 End if
  • 以前のサンプルコード 17.x
 Open window(100;100;300;200;0;"Chronometer")
 $vhTimeStart:=Current time
 $vlTicksStart:=Tickcount
 $vrMillisecondsStart:=Milliseconds
 Repeat
    GOTO XY(2;1)
    MESSAGE("時間...........:"+String(Current time-$vhTimeStart))
    GOTO XY(2;3)
    MESSAGE("Tick..........:"+String(Tickcount-$vlTicksStart))
    GOTO XY(2;5)
    MESSAGE("ミリ秒...:"+String(Milliseconds-$vrMillisecondsStart))
 Until((Current time-$vhTimeStart)>=?00:01:00?)
 CLOSE WINDOW

リンク