作成 2010.01.28
更新 2010.01.29
更新 2010.01.29
VBScript で関数やサブルーチンを非同期に実行する
WScript はマルチスレッドが実装されていないので、関数やサブルーチンを非同期に実行するには別のプロセスを作る必要があります。
しかしながら、別のプロセスを作るにはファイルを実行する必要があるため、以下の3通りの手段が考えられます。
- 複数のスクリプトを作成し一方のスクリプトから実行する
一番一般的で簡単です。複数のファイルをまとめて扱う必要があります。2つ3つでは問題ありませんが、10個、20個ともなれば少々手間です。 - 1つのスクリプトから %TEMP% フォルダにスクリプトを別途作成して実行する
1つのファイルなので完成したら扱いやすいですが、スクリプトを作るスクリプトを記述する必要があります。また、生成したスクリプトを削除するコードを書く必要がありますが、途中で停止された場合ごみが残ります。 - 1つのスクリプトを引数によって挙動を変えて実行する
下のような感じで。1つのスクリプトで引数により実行する関数を変更します。これにより1と2の欠点を解消します。
Option Explicit Dim ProcNumber, WshShell Set WshShell = CreateObject("WScript.Shell") If WScript.Arguments.Count = 0 Then ProcNumber = 0 Else ProcNumber = CInt(WScript.Arguments(0)) End If Select Case ProcNumber Case 0 Call Proc0 Case 1 Call Proc1 Case Else WScript.Echo "else" End Select WScript.Quit Sub Proc0 ' Proc1 を別プロセスで非同期に実行する ProcNumber = 1 WshShell.Exec "wscript " & WScript.ScriptName & " " & ProcNumber WScript.Echo "Main" End Sub Sub Proc1 WScript.Sleep 3000 WScript.Echo "second" End Sub
タグ: VBScript