title: VBScript threading
body: <p>A while back I smashed together this multithreading code in vbscript and I've just pulled it out again to apply it to another problem. I'm now having an issue where the return value of the run command (line 20) is always 0. I realize I've used <code>False</code> as the WaitOnReturn argument, however it won't thread otherwise. I'm pretty sure it worked perfectly or I wouldn't have kept it for so long...</p>
  
  <p>Can anyone see what I've done wrong?</p>
  
  <pre><code>Class Thread
  ' Usage:
  '    Dim x: Set x = New Thread
  '    Call x.init(10)
  '    Call x.queue("script.bat", Array("Arg1", "output_file.txt"))
  '    Call x.queue("cscript.exe prog.vbs", Array("Arg1", "Arg2", "Arg3"))
  '    Call x.setMax(20)
  ''''''''''''''''''''''''''''''''''''''''''''''
     Private p_threads
     Private p_max
  
     Private Function spawn(action, args)
        Dim wsh: Set wsh = WScript.CreateObject("WScript.Shell")
        Dim command: command = action
        Dim element
        For Each element In args
           command = command &amp; " " &amp; element
        Next
        spawn = wsh.Run(command, 0, False)
        Set wsh = Nothing
     End Function
  
     Public Sub queue(action, args)
        If Ubound(p_threads,1) &lt; p_max Then
           ' create new thread
           ReDim Preserve p_threads(Ubound(p_threads, 1)+1)
           p_threads(Ubound(p_threads, 1)) = spawn(action, args)
        Else
           ' recycle old thread
           Do
              Dim i
              For i = 1 To Ubound(p_threads, 1)
                 ' find a thread which has finished
                 If p_threads(i) = 1 Then
                    p_threads(i) = spawn(action, args)
                    Exit Sub
                 End If
              Next
              ' wait for a thread to finish
              WScript.Sleep 300
           Loop Until False
       End If
     End Sub
  
     Public Sub init(n)
        p_threads = Array(1)
        p_max = n
     End Sub
  
     Public Property Let setMax(n)
        p_max = n
     End Property
  End Class
  </code></pre>