dポイントプレゼントキャンペーン実施中!

たまたまGetTickCountの49.7日の境目を通過したと思しき値の急変を経験しました。
ログで処理時間を記録する必要があり、GetTickCountを使用していましたが、境目を意識したプログラムになっていません、下記にて修正を加えるつもりです。

『メイン側』
Dim arg_apiS As Long
arg_apiS = GetTickCount
・・・・処理・・・・
Dim arg_apiN As Long
Dim arg_subTime As Long
arg_apiN = GetTickCount
Call ******(arg_apiS, arg_apiN, arg_subTime)
select case arg_subRslt
・・・・・・
『CallSub側』
Sub ******(ByRef arg_apiS As Long,arg_apiN As Long, arg_subTime As Long)
Select Case True
Case arg_apiS < arg_apiN
arg_subRslt = arg_apiN - arg_apiS
Case arg_apiS < arg_apiN
arg_subRslt = (2 ^ 32 - arg_apiS) + arg_apiN
End Select

単純動作は確認OKですが、境目の模擬的発生もできず・・・
境目を跨いだ状態でも、正常に動くのか確認したく質問しました。
よろしくお願いします。

A 回答 (2件)

Case arg_apiS < arg_apiNはまずいですね。


arg_apiS = 49.6日
arg_apiN = 49.8日(オーバーフローして0.1日となる)
この場合に意図した動作になりません。

このサブルーチンの中でもう一度GetTickCountで時間を取得します。仮にこの時間をXとしましょう。
S = X - arg_apiS
N = X - arg_apiN
このSとNを比較すれば49.7日の境目の影響を受けません。検証してみましょう。
arg_apiS = 49.6日
arg_apiN = 0.1日(49.8日)
X = 1.0日

S = X - arg_apiS = 1.1日前(-48.7日のアンダーフロー)
N = X - arg_apiN = 0.9日前

比較すればarg_apiSの方が古いと正しく判断できます。

これが基本的なオーバーフロー(49.7日)問題の回避方法です。
    • good
    • 0
この回答へのお礼

出張で、お礼が遅れてしまいました。
ありがとうございました。

お礼日時:2019/03/26 09:33

前提条件の確認なのですが


Sub ******を呼び出したとき、
arg_subTimeは使用していないように見えますが、それであってますか。
arg_subRslt は、『メイン側』にも『CallSub側』にも宣言されていませんが、module 変数として、
2つのプロシージャの外側で宣言されているのでしょうか。そうだとして 型はLong型でしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございました。
元Prg訳あり変数を、書替時に間違えた様です。
混乱させてしまいました。
申し訳ありません。

お礼日時:2019/03/26 09:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!