作成 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