【原创】 实现Javascript的 sleep(ms) 实现暂停,可用于服务器

   朋友问在Javascript中如何实现Sleep,我知道原来没有,但我想,也许可以通过微软的COM来实现。

    我第一想到了 XMLHttp,下面是我的实现方案。希望起到抛砖引玉的作用。

    因为:Msxml2.ServerXMLHTTP 只能在本地或服务器脚本中运行。
点下面的 “运行代码” 按钮将没有权限执行。所在应该把下面的代理复制,新建一个Html文件,来运行。

  1 <html>
  2<head>
  3<title>阿牛测试</title>
  4</head>
  5<body>
  6<script language=javascript>
  7 /*
  8 * 函数名: evlon.sleep(ms)
  9 * 作者:   evlon(阿牛) MSN:niukl@msn.com  QQ:273352165
 10 * 功能:   模拟 C 语言的 Sleep
 11 * 用途:   用到时就有用了,最简单的情况就是在聊天室的服务端中,
 12 *          通过循环把Application的内容写到客户端,但这样会CPU占用率过高
 13 *          这时把这个函数加入,会几乎不占用CPU
 14 *           
 15 */
 
 16 function Evlon()
 17 {
 18  this.xh = new ActiveXObject("Msxml2.ServerXMLHTTP");
 19  this.lresolveTimeout = 0;   // 解析DNS名字的超时时间
 20  this.lconnectTimeout = 500;   // 建立Winsock连接的超时时间
 21  this.lsendTimeout = 0 ;    // 发送数据的超时时间
 22  this.lreceiveTimeout = 0 ;    // 接收response的超时时间
 23  this.xh.setTimeouts(this.lresolveTimeout,this.lconnectTimeout,this.lsendTimeout,this.lreceiveTimeout);
 24  this.urlport = "http://127.0.0.1:1111";
 25
 26 }
        
 27 Evlon.prototype.sleep = function(ms)
 28 {
 29  var beg = new Date();
 30  
 31  var count = Math.floor(ms / 500);
 32  var lastms = ms % 500;
 33  this.xh.setTimeouts(this.lresolveTimeout,this.lconnectTimeout,this.lsendTimeout,this.lreceiveTimeout);
 34  
 35  for(var i = 0 ;i< count + 1++i)
 36  {
 37   //先看一下时间过了没有
 38   var now = new Date();
 39   if(ms < now - beg)
 40   {
 41    break;
 42   }

 43   else
 44   {
 45    if( i == count)
 46    {
 47     this.xh.setTimeouts(this.lresolveTimeout,lastms,this.lsendTimeout,this.lreceiveTimeout);
 48    }

 49    
 50    //Sleep
 51    try
 52    {
 53     this.xh.open("GET",this.urlport,false,null,null);
 54     this.xh.send();
 55    }

 56    catch(e){
 57    }

 58    
 59   }

 60  }

 61  
 62 }

 63 
 64 
 65 
 66 //下面是测试程序,在指定时间内观查CPU占用率
 67 function testSleep(timeSpan /**/)
 68 {
 69  try
 70  {
 71   var beg = new Date();
 72   var evlon = new Evlon();
 73   var nCount = 0;
 74   while(true)
 75   {
 76    var end = new Date();
 77    var span = end - beg;
 78    
 79    if(span > timeSpan * 1000)
 80    {
 81     break;
 82    }

 83    
 84    nCount ++;
 85    evlon.sleep(200);
 86   }

 87   
 88   var end = new Date();
 89   var span = end - beg;
 90   var msg = '共运行' + nCount.toString() + '次\n占用时间' + span + '毫秒';
 91   alert(msg);
 92  }

 93  catch(e)
 94  {
 95   alert(e.message);
 96  }

 97 }

 98 
 99 testSleep(5);
100 
101
</script>
102</body>
103</html>
posted @ 2005-11-09 11:25  阿牛  阅读(3139)  评论(0编辑  收藏  举报