zoukankan      html  css  js  c++  java
  • asp版火种雏形版(三)用asp模拟多线程

    继续上篇

    global.asa页面代码:

    <SCRIPT RUNAT="Server" LANGUAGE="Javascript">
    Server.ScriptTimeOut=99999999;//设置SL的生命周期
    function Application_OnStart(){//将代码放在application_onstart事件中
    var l=1;
    while(l=1){//死循环
    try{
    xt();//执行错误url连接2秒为心跳周期
    }catch(e){//缓存错误
    Server.Execute("1.asp");//执行真正的目的代码
    }
    }
    }

    将循环放在Application_Onstart{

    }的这个括号中会很有问题,因为循环一直执行这个线程是不会放开的,这样虽然SL活了,但是别的用户却无法浏览,换句话说Application_Onstart这个触发事件始终没有完成!这个问题困扰了我好久。

    曾走的弯路:

    js中没有像vbs中的触发事件,Private Sub Class_Initialize

    我曾经用vbs这样写:

    ================================

    <script language="vbscript" runat="server">
    sub Application_OnStart
    set theprouce=new theclass '如果在sub中声明class会报错 这样可以解决在sub想要class的问题
    end sub

    Class theclass 
    Private Sub Class_Initialize
    End Sub

    Private Sub Class_Terminate 
    l=1
    while l=1
    call doit3
    wend
    End Sub

    Private sub doit1
    set xmlServerHttp =server.createobject("Msxml2.ServerXMLHTTP")
    lResolve = 2 * 1000
    lConnect = 2 * 1000
    lSend = 2 * 1000
    lReceive = 2 * 1000
    xmlServerHttp.setTimeouts lResolve, lConnect, lSend, lReceive
    xmlServerHttp.open "GET", "http://212.97.224.68/quickstart/aspplus/doc/businessobjs.aspx", false
    xmlServerHttp.send
    end sub
    '-----------
    Private sub doit2
    set conn=Server.CreateObject("ADODB.Connection")
    conntext="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\1\jsser\db.mdb"
    conn.open conntext
    sql="insert into [db1] ([tt],[cc],[aa])values('1','2','3')"
    conn.Execute sql
    conn.Close
    set conn=null
    end sub
    Private sub doit3
    on error resume next 
    call doit1
    if err.number<>0 then  
    call doit2
    end if
    end sub
    End Class

    =================================

    但我发现 虽然在字面上是在class关闭时触发事件 但他做事还是在Application_onstart中所以还是没有放开线程的可能,只好放弃vbs,顺便说一句try catch用着真的不如js的方便,真是各有长处呀!哪个都不舍得!呵呵。

    找到出路:

    实际在global.asa中可用的事件只有4个,相信对asp了解一些的都知道,我把目光转移到了session_onstart(session_onend也一样)上经过多测试验,将运行没问题的代码奉上,

    global.asa页面代码:

    <SCRIPT RUNAT="Server" LANGUAGE="Javascript">
    Server.ScriptTimeOut=99999999;
    function Application_OnStart(){
    }
    function Session_OnStart(){
    }
    function Session_OnEnd(){
    if(Application("key")!=null){//假如SL之key不为空将启动SL
    Application("key")=null;//马上将SLkey关闭
    setinterval(2000);//2秒为心跳周期
    //----------------------
    function setinterval(a){
    var l=1;
    while(l=1){
    try{
    xt();
    }catch(e){
    doit();
    }
    }
    function doit(){
    var conntext="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
    conntext +="E:\\1\\jsser";
    conntext +=http://www.cnblogs.com/329521/admin/file://db.mdb/;  //这里一写(\)(\)db.mdb编辑器就自己给改了郁闷读者自己改吧。
    var conn=Server.CreateObject("ADODB.Connection");
    conn.Open(conntext);
    var sql2="insert into [db1] ([tt],[cc],[aa])values('1','2','3')";
    conn.Execute(sql2);
    conn.Close();
    conn=null;
    }
    //----------------
    function xt(){
    var xmlServerHttp = new ActiveXObject("Msxml2.ServerXMLHTTP");
    var lResolve = a;
    var lConnect = a;
    var lSend = a;
    var lReceive = a;
    xmlServerHttp.setTimeouts(lResolve, lConnect, lSend, lReceive);
    xmlServerHttp.open("GET", "http://212.97.224.68/quickstart/aspplus/doc/businessobjs.aspx", false);
    xmlServerHttp.send();
    }
    }
    //----------------------

    }
    }
    function Application_OnEnd(){
    Application.StaticObjects.RemoveAll();
    }
    </SCRIPT>

    slkey.asp页面代码:

    <script language="js" CODEPAGE="936"%>//读者自己改成%编辑器依然跟我作对!!!
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>无标题文档</title>
    </head>

    <body>
    <%
    Session("key")=Session.SessionID;
    Application.Lock();
    Application("key")=Session("key")+"";
    Application.Unlock();
    Session.Abandon();
    Response.Write("祝贺你的SL之匙已经启动");
    %>
    </body>
    </html>

    都放在一个根目录下,cmd下 iisreset 切记取消应用池的默认设置,否则会按着他的时间回收。然后浏览一下slkey.asp观察你的数据库是不是在2秒加一条记录?这时候我没看看session_onend会不会像application_onstart一样被锁住?

    test.asp页面代码:

    <% js CODEPAGE="936"%>//无语中。。。
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>Untitled Document</title>
    </head>

    <body>
    <%
    Response.Write(Session("test")+"<br/>应该没有值了");
    Session.Abandon();
    Session("test")=null;
    Response.Write(Session("test")+"");
    %>
    </body>
    </html>

    session("值")一样会被消灭!浏览一切正常。还要记住一点slkey最好只有一个人知道,也只有你一个可以启动!到现在他已经完全符合我最初的设想:

    Server Live的要求了!Server Live就这样诞生了,真的很高兴!呵呵,再接再厉下一篇我们用application做一个强大的catch。

    小结:Server Live的两大靓点:1.他不会随着浏览器的关闭而停止,他会一直工作直到没电或iisreset或生命周期到了。2.他的工作不会影响浏览者的动作(模拟的多线程)。希望对大家有用,那么他适合什么样的应用呢?读者可以自己想,类似股票行情,搜索引擎等。但为了稳定也可以在有条件的情况下,设置一个应用服务器,一个Server Live服务器,一个数据库或application服务器。文章到此,下篇application见。

    我的qq:674096197,欢迎一起探讨asp javascript 不在线请弹屏一下!
  • 相关阅读:
    第十一周编程总结
    第十周编程总结
    第九周
    第八周
    第七周编程总结
    第六周编程总结
    学期总结
    第十四周课程总结&实验报告(简单记事本的实现)
    第十三周课程总结
    第十二周课程总结
  • 原文地址:https://www.cnblogs.com/329521/p/1657572.html
Copyright © 2011-2022 走看看