VBScript threading

2020-06-06 17:22发布

问题:

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 False 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...

Can anyone see what I've done wrong?

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 & " " & element
      Next
      spawn = wsh.Run(command, 0, False)
      Set wsh = Nothing
   End Function

   Public Sub queue(action, args)
      If Ubound(p_threads,1) < 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

回答1:

Sorry, wsh.Run() is not threading by any stretch of the imagination. It starts a new process, not a thread.

Getting 0 as a return is the expected outcome if you do not use the 4th argument. Documentation is here.