JavaScript 与多线程

来源:互联网 发布:linux ps 线程 编辑:程序博客网 时间:2024/05/07 21:53

从昨天晚上开始与javascript的多线程周旋,虽然没有什么结果,但对单CPU上的“多线程”有了更深的认识。总结如下:
1.单CPU计算机上没有真正的并行,单CPU计算机上可以用编程的方法在单线程中来模拟“多线程”。
虽然在本科的操作系统课上就学习过这些知识,但是,长久以来,自己没有对这个问题进行详细的思考。说白了,没有参与开发过多线程相关的项目(太羡慕其他一些人了!)。在单CPU计算机中,某一个时刻的点,CPU只能被一个线程占用。所谓“并行”,是从宏观的一段时间上来观察操作系统行为的结果。

2.在javascript中,可以用三种方式来模拟多线程。
a)在javascript中用command模式模拟多线程
b)window.setTimeout(code,time)
让代码在指定时间后执行一次。
c)setInterval(code,time)
让代码按照指定时间间隔来执行。

注意setTimeout与setInterval的区别

3.似乎无法在javascript的单线程执行环境中利用AutoItX来捕捉onload事件中的alert。
背景:selenium中采用了重载window.alert的方式,来截获所有javascript中的alert。
Window.alert = function (msg) {
This.Alerted.push(msg);
};
这样,所有的alert消息被悄无声息地存放在一个队列中。原本的alert弹出后,如果不点击OK或者关闭,整个javascript执行线程就一直停止。重载window.alert的方式避免弹出alert窗口,保证了selenium顺利地执行。
但是,这种方式无法捕捉body的onload事件中的alert。因为每一次刷新页面的时候,所有的被重载的方法和事件都会被清空,而我们来不及再一次重载alert方法。
使用Watir的时候,我注意到了她是借助一个名为AutoItX库来实现这个功能的。于是,设想是否可以通过同样的方法来捕捉onload事件中的alert方法。
我不详细介绍AutoItX类库,简要说一下她的原理:
var autoit = new ActiveXObject(“AutoItX3.Control”);
autoit.WinWait(title,text,…);//等待标题为title,包含text的窗口出现

开始的设想是使用如下的方法来不断查询alert窗口是否弹出:
window.setTimeout(‘fuction check() {autoit.WinExists(title,txt) == 1?return:check()’,100)
但是,却无法捕捉到alert。原因就是alert弹出后,如果不点击OK或者关闭,整个javascript执行线程就会停止。所以,调用check函数的计时也停止了。这个问题用模拟多线程是无法解决的。

对于这个问题的一个解决方案

原创粉丝点击