Wscript中的事件机制

,

js文件


// log输出函数
function _WriteLog(str)
{
    objLogFile.WriteLine(str);
}
function _ConsoleWrite(str)
{
    _WriteLog(str);
    WScript.StdOut.WriteLine(str);
}

var m_fso = new ActiveXObject("Scripting.FileSystemObject");
var m_http = new ActiveXObject("Microsoft.xmlhttp");
// log文件
var objLogFile = m_fso.OpenTextFile("." + "\\" + "log.txt", 2 , true);
m_http.open("GET", "http://blog.csdn.net/dongzhiquan/archive/2009/12/19/5039471.aspx" , true);
m_http.onreadystatechange = function(){_ConsoleWrite("aa");}
m_http.send("");
while(true){_ConsoleWrite("bb");}

调用bat文件


cscript.exe test.js
pause


结果是:aa只输出了一次自从自从bb开始输出之后就再也不输出了;将_ConsoleWrite("bb");去掉之后aa仍然只是输出一次.

二,


js文件


// log输出函数
function _WriteLog(str)
{
    objLogFile.WriteLine(str);
}
// 信息输出函数
function _Debug(str)
{
    _WriteLog(str);
    m_wsh.popup(str);
}
function _ConsoleWrite(str)
{
    _WriteLog(str);
    WScript.StdOut.WriteLine(str);
}

var m_fso = new ActiveXObject("Scripting.FileSystemObject");
var m_http = new ActiveXObject("Microsoft.xmlhttp");
// log文件
var objLogFile = m_fso.OpenTextFile("." + "\\" + "log.txt", 2 , true);
m_http.open("GET", "http://blog.csdn.net/dongzhiquan/archive/2009/12/19/5039471.aspx" , true);
m_http.onreadystatechange = function(){_ConsoleWrite("aa");}
m_http.send("");
while(true){_ConsoleWrite("bb");WScript.Sleep(1);}

调用bat文件与上面相同

结果是:aa在bb之间进行了输出;将wscript.sleep()参数改为0,结果便又与例1中的相同了,证明不是因为多了 WScript.Sleep 这一条语句而使事件可以执行,而是因为sleep了一段时间导致事件可以执行的

aa
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
aa
bb
bb
bb
bb
bb
bb
aa
bb
aa

三,

js文件


// log输出函数
function _WriteLog(str)
{
    objLogFile.WriteLine(str);
}
// 信息输出函数
function _Debug(str)
{
    _WriteLog(str);
    m_wsh.popup(str);
}
function _ConsoleWrite(str)
{
    _WriteLog(str);
    WScript.StdOut.WriteLine(str);
}

var m_fso = new ActiveXObject("Scripting.FileSystemObject");
var m_http = new ActiveXObject("Microsoft.xmlhttp");
// log文件
var objLogFile = m_fso.OpenTextFile("." + "\\" + "log.txt", 2 , true);
m_http.open("GET", "http://blog.csdn.net/dongzhiquan/archive/2009/12/19/5039471.aspx" , true);
m_http.onreadystatechange = function(){_ConsoleWrite("aa");}
m_http.send("");

bat文件与例1相同


结果为:aa,网页事件还没来得及执行,程序本身已经结束了. 一般情况下这种结果不会是我们所想要的结果,我们当然希望在网页加载完毕之后对网页做处理.要实现这个则必须要在网页加载完毕前提供延时供事件使用.

通过以上比较可知,wscript中绑定事件的执行机制:

  首先将wscript看做一个cpu,它本身就是单线程的,只是在空闲时间会去扫描事件标识执行绑定函数.而这个空闲时间就是我们在调用wscript.sleep()的时间

   所以虽然wscript的确是支持时间绑定的,当wscript中绑定事件的执行有时间是不能保证正确性的.

   本例中则最好设置xmlhttp为同步,或通过对m_http状态轮询来实现,而避免使用事件绑定.

Microsoft Windows 脚本技术chm 帮助文件原文:

    Sleep 方法运行时脚本的线程被挂起,释放它所占用的 CPU。超过指定的时间间隔后,脚本继续执行。如果您运行异步操作和多过程,或者您的脚本中包括由事件触发的代码,Sleep 方法就尤其有用。要由事件触发脚本,则脚本必须始终处于活动状态(已执行完的脚本肯定检测不到事件)。脚本所处理的事件仍将在休眠阶段执行。

posted @ 2009-12-19 20:02  dzqabc  阅读(582)  评论(0编辑  收藏  举报