サンプルコード集#
新機能を使ったサンプルコード#
時間の計測 (クラス、クロージャ)#
実行時間計測用のタイマーを実装してみます
gettime
を二度呼び出しその差分を得ることで経過時間を取得できますが、UWSCでは以下のような問題がありましたミリ秒での計測が面倒
最初のgettimeの結果を隠蔽しにくい
UWSCRの
gettime
はミリ秒に対応していますそれと、新たに追加されたクラスやクロージャ機能を使ってこれらを解決していきます
この方法だと上記を解決するばかりか、複数の計測を並行するのも簡単になります
クラスを使う#
Timerクラスを実装し、それにより経過時間を計測します
インスタンスを複数作ることで並行計測も可能です
class Timer
dim from
// コンストラクタで計測開始時の時間をセット
procedure Timer()
this.from = this.now()
fend
// 現在時刻をミリ秒で取得
dim now = function()
result = gettime(, , , TRUE)
fend
// 経過時間を返す
function elapsed()
result = this.now() - this.from
fend
endclass
t = Timer()
msgbox("好きなタイミングでOKを押す")
msg = t.elapsed() + " ミリ秒経過しました"
msgbox(msg)
クロージャを使う#
クラスよりもスッキリ書きたい場合はこちら
関数の戻り値を無名関数にすることで、その中に値を閉じ込めておくことができます
この場合は計測開始時を戻り値の無名関数に持たせておくことで、その関数を実行すると経過時間が得られる仕組みです
// 経過時間を得る関数を返す関数 (エンクロージャ)
function timer()
s = gettime(,,,TRUE)
// 経過時間を返す関数 (クロージャ)
// 計測開始時間(s)を保持している
result = function()
result = gettime(,,,TRUE) - s
fend
fend
elapsed = timer()
msgbox("好きなタイミングでOKを押す")
msg = elapsed() + " ミリ秒経過しました"
msgbox(msg)
UWSCでやるなら?#
モジュールを使えば一応要件を満たすことはできます
id指定により並行計測も可能としていますが、都度id指定が必要なのが不便ですね
Timer.Start(1)
msgbox("好きなタイミングでOKを押す")
msg = Timer.End(1) + " ミリ秒経過しました"
msgbox(msg)
module Timer
hashtbl s
procedure Start(id)
s[id] = GetTickCount()
fend
function End(id)
result = GetTickCount() - s[id]
fend
def_dll GetTickCount():dword:kernel32.dll
endmodule
TIPS#
UWSCとUWSCRを判別#
GET_UWSC_PRO
で判別できますUWSCではPro版か否かでTRUEまたはFALSEを返していましたが、UWSCRではEMPTYを返します
select GET_UWSC_PRO
case TRUE
print "UWSC Pro版です"
case FALSE
print "UWSC 無料版です"
case EMPTY
print "UWSCRです"
selend