有没有办法在VBS中进行非阻塞IO或者在COM事件中发出信号?

时间:2009-07-22 22:53:48

标签: vbscript

我有一个Windows Media Encoder附带的脚本变体。我通过WSH启动它并将管道设置为STDIN,STDOUT和STDERR。

脚本开始编码并最终在DO循环中等待检查​​编码对象的状态,以便脚本知道在编码停止时退出。 (内部循环只打印一段时间,并且睡眠约2秒)。

为了彻底退出,我想发信号通知脚本停止编码,这将允许它从循环中删除并清理。

我没有(或者一定想)在我们的应用程序中实现了一个COM对象,它启动了脚本 - 否则,我只是触发一个事件。 (我会重新考虑这是否比我想在C ++中更容易)

我想过只是通过STDIN发送一个字符来退出,但问题是WScript.stdin的所有方法都阻塞了。 是否有任何非阻塞方式从stdin读取或以某种方式检查字符?

可以在VBS中执行一个线程吗?据我所知,你只能采取其他程序。

1 个答案:

答案 0 :(得分:2)

VBS是单线程的,没有可以在WScript对象中使用的非阻塞调用。

用于异步发送循环信号的经典VBS kludge是使用文件系统对象。您的调用进程和VBScript需要就要监视的文件夹位置达成一致(现在我们称之为c:\ temp)。

在初始化期间,您的脚本会: -

 Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")

在你的代码循环中: -

 If fso.FileExists("c:\temp\signal.dat") Then
     fso.DeleteFile "c:\temp\signal.dat" 
     '' // Tidy up and exit loop
 End If

您调用进程只是创建一个名为“c:\ temp \ signal.dat”的文件,以指示脚本。

它丑陋但它有效。