myara CG blog

CG Design Blog. Thoughts, experiments and experiences.

VBS : Sleep / Wait

何日前にxsibase.comに出ていた質問は先週からずっと気になっていましたが、誰も返事していません。

VBScript に Wscript.Sleep というコマンドがあるけどなぜかWscript コマンドはXSI上では実行出来ません。

それで、一時的にスクリプトをとめたい時にどうすれば良いのか?という質問です。

質問した人は結局、While Loopで解決しましたようです。

'VBScript
Function GoSleep(seconds)
startTime = Time()
endTime = DateAdd("s",seconds,startTime)
While endTime >= Time()
Wend
End Function

しかし、このやり方だと、指定した時間にならないと、時間をチェックし続けるループなのでCPUが働きまくってあんまり良くないですね。

で、思いついたことは、XSIの中からWindowsのVBSスクリプトを実行させればWScriptが動作出来るんじゃないかなと。

それで、まずは どこかに スリープ専用VBS を作っておきましょう。(例:c:\sleep.vbs)

そのsleep.vbsのコードは:

'VBScript
dim mult : mult = wscript.Arguments.Item(0)
wscript.sleep 1000 * mult


WScript.sleepのインプットはミリ秒なので、1000にしました。
そして、multというコマンドライン変数を作って、wait.vbs 3 とか実行したら 3秒 止まるようにします。
コマンドライン変数なんて、俺的な名前ですよ。プログラマーじゃないんだから適当です。すみません、調べる気がありません。

で、sleep.vbs 完成!

次はXSIから実行させるコマンド:

'VBScript
function GoSleep(seconds)
Set WshShell = CreateObject("WScript.Shell")
returnCode = WshShell.Run("c:\sleep.vbs " & seconds, ,1)
end function

GoSleep 5 'wait 5 seconds


これでsleep.vbsをfunctionみたいに使えるようになりました。

※ ポイント:
最後の「1」は重要です。
このブーレアン値は実行したVBSの終了まで待つか待たないかというオプションです。
デフォルト値は false / 0 になります。デフォルトのままにしたら、sleepが実行している間にスクリプトが続くので効果がありません。マルチタスクスリープみたいな無駄なことになってしまいます。

もちろんこれもJScriptでも使えます。

こんな感じかな

//JScript
var seconds = 1
var WshShell = new ActiveXObject("WScript.Shell");
WshShell.run("C:\\sleep.vbs " + seconds, 2, 1)



問題はですね、フルパスが必要なんですよ。同じフォルダに入れてもちゃんとフルパス書かなきゃいけないんです。多分。(俺はそのやり方が知らないだけかも)

どうしてもフルパスは嫌なら、Self-Install Pluginにしてプラグインのパスを読みこむしかないです。多分ね。

こんな感じかな:

'VBScript
dim oPlugin, PluginPath
set oPlugin = Application.Plugins( "プラグイン名" )
PluginPath = oPlugin.OriginPath



これでCPUを使わずにスリープが出来ます!

スリープなんてあんまり使わないけど、一応ね。