<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    emu in blogjava

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      171 隨筆 :: 103 文章 :: 1052 評(píng)論 :: 2 Trackbacks

            作者:emu(黃希彤)今天和徐鵬程msn的時(shí)候聊起javascript不支持多線程。以前也看過(guò)有高手在wsh上可以創(chuàng)建thread對(duì)象,但是畢竟不是常規(guī)手段,我們做web應(yīng)用一般沒(méi)有本地訪問(wèn)權(quán)限的,用activex的沒(méi)試過(guò),畢竟也不是javascript方式。

            以前我們解決這樣的問(wèn)題都是針對(duì)具體問(wèn)題寫(xiě)一段代碼來(lái)模擬多線程的,但是由于往往要對(duì)沒(méi)個(gè)線程單獨(dú)編碼,這樣的代碼十分冗長(zhǎng)。學(xué)習(xí)設(shè)計(jì)模式的時(shí)候就曾經(jīng)考慮過(guò)在javascript中實(shí)用command模式來(lái)更好的模擬多線程,但是一直沒(méi)有付諸實(shí)施,今天既然想起來(lái)了就試試看:

     1<html><head><title>emu -- 用command模式模擬多線程</title></head><body>
     2<SCRIPT LANGUAGE="JavaScript">
     3<!--
     4if (Array.prototype.shift==null)
     5Array.prototype.shift = function (){
     6    var rs = this[0];
     7    for (var i=1;i<this.length;i++this[i-1]=this[i]
     8    this.length=this.length-1
     9    return rs;
    10}

    11if (Array.prototype.push==null)
    12Array.prototype.push = function (){
    13    for (var i=0;i<arguments.length;i++this[this.length]=arguments[i];
    14    return this.length;
    15}

    16
    17var commandList = [];
    18var nAction = 0;//控制每次運(yùn)行多少個(gè)動(dòng)作
    19var functionConstructor = function(){}.constructor;
    20function executeCommands(){
    21    for (var i=0;i<nAction;i++)
    22        if (commandList.length>0){
    23            var command = commandList.shift();
    24            if (command.constructor == functionConstructor)
    25                if (command.scheduleTime == null || new Date()-command.scheduleTime>0)
    26                    command();
    27                else
    28                    commandList.push(command);
    29        }

    30}

    31
    32function startNewTask(){
    33    var resultTemp = document.getElementById("sampleResult").cloneNode(true);
    34    with (resultTemp){
    35    id="";style.display="block";style.color=(Math.floor(Math.random()* (1<<23)).toString(16)+"00000").substring(0,6);
    36    }

    37    document.body.insertBefore(resultTemp,document.body.lastChild);
    38    commandList.push(function(){simThread(resultTemp,1);});
    39    nAction++;
    40}

    41
    42function  simThread(temp,n){
    43    if (temp.stop) n--;
    44    else temp.innerHTML = temp.innerHTML - (-n);
    45    if (n<1000)
    46        commandList.push(function(){simThread(temp,++n)});
    47    else{
    48        var command = function(){document.body.removeChild(temp);;nAction--;};
    49        command.scheduleTime = new Date()-(-2000);
    50        commandList.push(command);
    51    }

    52}

    53
    54window.onload = function(){setInterval("executeCommands()",1);}
    55//-->
    56
    </SCRIPT>
    57<button onclick="startNewTask()">開(kāi)始新線程</button>
    58
    59<BR><BR>
    60<div id=sampleResult onmouseover="this.stop=true" onmouseout="this.stop=false" style="display:none;cursor:hand">0</div>
    61</body>
    62</html>

            注意第26行。javascript里面函數(shù)也是對(duì)象,所以就沒(méi)有必要把函數(shù)調(diào)用包裝到do或者execute方法里面了,直接用()就可以讓函數(shù)對(duì)象運(yùn)行起來(lái):
    command();

            shift和push函數(shù)是javascript中array對(duì)象的函數(shù),可是IE5居然沒(méi)有定義,最前面兩個(gè)函數(shù)是為IE5準(zhǔn)備的。

            在IE和FireFox下面通過(guò)作者:emu(黃希彤)

    posted on 2005-06-08 20:29 emu 閱讀(6789) 評(píng)論(34)  編輯  收藏

    評(píng)論

    # re: 在javascript中用command模式模擬多線程 2005-06-14 19:25 emu
    有網(wǎng)友提出,每個(gè)內(nèi)嵌框架(iframe)都有自己的window對(duì)象,應(yīng)該可以分別在其中開(kāi)啟獨(dú)立的線程。試驗(yàn)后發(fā)現(xiàn),所有的iframe其實(shí)都是在top的線程之中,他們的計(jì)算任務(wù)會(huì)相互堵塞,所以不可行:
    <html>
    <head>
    <title></title>
    </head>
    <body>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    var count1=0;
    var count2=0;
    var elm = document.createElement("iframe");
    document.body.insertBefore(elm);
    elm.style.display="none";
    document.frames[0].document.write("<script>setTimeout(\"for (var i=0,n=0;i<=10001;n+=i++){parent.count1=n;parent.status=parent.count1+' - '+parent.count2};\",1000)<\/script>")

    var elm = document.createElement("iframe");
    document.body.insertBefore(elm);
    elm.style.display="none";
    document.frames[1].document.write("<script>setTimeout(\"for (var i=0,n=0;i<=10001;n+=i++){parent.count2=n;parent.status=parent.count1+' - '+parent.count2};\",1000)<\/script>")
    //-->
    </SCRIPT>
    </body>
    </html>

    還有網(wǎng)友提出,新開(kāi)窗口是運(yùn)行的獨(dú)立的線程(或進(jìn)程,取決于windows的配置)中,試驗(yàn)了一下,確實(shí)是如此,如果需要在后臺(tái)做大量的運(yùn)算的話(huà)可以考慮這種方式,運(yùn)算速度比command模式模擬的要快幾個(gè)數(shù)量級(jí):

    <html>
    <head>
    <title></title>
    </head>
    <body>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    function newTask(left){
    var win = window.open("","","top=300,height=100,status=yes,width=300,left="+left);
    win.document.write("<script>setTimeout('for (var i=0,n=0;i<=10001;n+=i++)status=n;',1000)<\/script>")
    }
    newTask(0);
    newTask(330);
    newTask(660);
    //-->
    </SCRIPT>
    </body>
    </html>
      回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2006-02-12 14:44 rom
    有沒(méi)試過(guò)在js里實(shí)現(xiàn) sleep 功能?  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2006-02-13 10:16 emu
    有阿,在上面的例子中點(diǎn)擊按鈕發(fā)起線程后,吧鼠標(biāo)放到正在運(yùn)行中的線程上,線程就會(huì)暫停下來(lái)知道鼠標(biāo)離開(kāi)。此外線程計(jì)算結(jié)束后也會(huì)延遲2秒清除結(jié)果,這個(gè)延遲也是使用sleep的方式實(shí)現(xiàn)的。看看 simThread 和 executeCommands 的相互配合。  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2006-02-15 15:53 rom
    不好意思,表達(dá)不清楚。我的意思是把 sleep 或 pause 寫(xiě)成一個(gè)方法,可以在其他方法中直接調(diào)用。
    比如:

    function test(){
    alert((new Date().getTime());
    pause(1000);
    alert(new Date().getTime());
    }
      回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2006-02-16 09:41 emu
    @rom
    只有使用異步設(shè)計(jì)的程序才能夠方便的控制“線程”的運(yùn)行狀態(tài),按照你貼出的代碼的暗示,pause方法是要堵塞主當(dāng)前正在運(yùn)行的腳本引擎進(jìn)程,讓腳本引擎停止工作。但是堵塞進(jìn)程會(huì)嚴(yán)重影響用戶(hù)體驗(yàn)并占用大量cpu資源,建議采用異步方式改善設(shè)計(jì)來(lái)實(shí)現(xiàn)延遲。同步的堵塞方式實(shí)現(xiàn)如下:

    function test(){
      alert(new Date().getSeconds());
      pause(1000);
      alert(new Date().getSeconds());
    }
    function pause(n){
      for(var t = new Date();(new Date()-t<n););
    }
    test();

      回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2006-02-16 12:02 rom
    用循環(huán)的那種當(dāng)然不行。看過(guò)一個(gè)實(shí)現(xiàn)如下:

    <html>
    <head>
    <script language="javascript">
    function Pause(obj,iMinSecond){
    if (window.eventList==null) window.eventList=new Array();
    var ind=-1;
    for (var i=0;i<window.eventList.length;i++){
    if (window.eventList[i]==null) {
    window.eventList[i]=obj;
    ind=i;
    break;
    }
    }

    if (ind==-1){
    ind=window.eventList.length;
    window.eventList[ind]=obj;
    }
    setTimeout("GoOn(" + ind + ")",1000);
    }

    function GoOn(ind){
    var obj=window.eventList[ind];
    window.eventList[ind]=null;
    if (obj.NextStep) obj.NextStep();
    else obj();
    }


    function test(){
    alert("test1");
    Pause(this,1000);
    this.NextStep=function(){
    alert("test11");
    }
    }

    </script>
    </head>
    <body>
    <button onclick="test()">test</button>
    </body>
    </html>


    如果測(cè)試代碼如下就有問(wèn)題了

    function test1(){
    alert("test1");
    Pause(this,1000);
    this.NextStep=function(){
    alert("test11");
    }
    }
    function test2(){
    alert("test2");
    Pause(this,1000);
    this.NextStep=function(){
    alert("test22");
    }
    }
    <button onclick="test1();test2()">test</button>  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2006-02-16 12:04 rom
    setTimeout("GoOn(" + ind + ")", 1000) 應(yīng)是 setTimeout("GoOn(" + ind + ")", iMinSecond)  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2006-02-16 13:06 emu
    呵呵,看起來(lái)和我很久以前寫(xiě)的例子非常像哦。
    我上面的解釋和上面你貼的代碼你都沒(méi)有理解到,跟你再解釋也說(shuō)不明白了……  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2006-02-16 15:44 rom
    有勞再解釋一下^_^

    你覺(jué)得頂樓代碼的重用性如何?
    你對(duì) jsvm 框架有什么看法?

      回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2006-02-17 11:12 emu
    我對(duì) jsvm 的看法在 http://community.csdn.net/Expert/topic/4559/4559660.xml 中講過(guò)了。我非常欣賞jsvm的設(shè)計(jì),可是沒(méi)有嘗試過(guò)去用。

    頂樓的代碼沒(méi)什么可重用性,我寫(xiě)blog和萬(wàn)常華大哥寫(xiě)jsvm的出發(fā)點(diǎn)是不同的,萬(wàn)大哥希望可以既授人以魚(yú)又授人以漁,我則更愿意授人以漁,只希望可以把代碼后面的思想表達(dá)出來(lái),把最困難最有價(jià)值的嘗試過(guò)程呈現(xiàn)出來(lái),真正能看懂其中思想的人并不需要記住實(shí)現(xiàn),下回遇到問(wèn)題順手就可以寫(xiě)出來(lái)了。就好像 http://community.csdn.net/Expert/topic/4555/4555563.xml 中,我對(duì)google的模仿并不在于看或抄google的代碼(到現(xiàn)在為止還沒(méi)有去看過(guò)google自定義模塊的原碼,可能以后有時(shí)間再去學(xué)習(xí)吧),而是理解了怎樣的用戶(hù)感受更爽,然后具體的實(shí)現(xiàn)其實(shí)不是關(guān)鍵問(wèn)題(我相信我的實(shí)現(xiàn)和google的沒(méi)有多少相像的地方)。

    多線程方面我懂的也不多,解釋也解釋不好,講多錯(cuò)多,還是自己去找資料好好學(xué)習(xí)吧。  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2006-03-16 23:50 guest
    如果每個(gè)command執(zhí)行時(shí)間比較長(zhǎng),比如1秒,所有"線程"都會(huì)被影響  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2006-03-17 14:26 emu
    呵呵command模式本身沒(méi)有這個(gè)問(wèn)題,對(duì)command的使用不當(dāng)才會(huì)帶來(lái)問(wèn)題。  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2006-11-22 18:08 009
    想問(wèn)一下樓主“點(diǎn)擊這里查看效果”那個(gè)按鈕怎么添加的
    還有我加入html代碼的時(shí)候,顯示出來(lái)的“<>“靠中間都有一個(gè)空格,不知道為什么
      回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2006-11-23 09:31 emu
    呵呵那個(gè)按鈕是手寫(xiě)的。分析一下頁(yè)面源碼就明白了,要是分析不明白,那講也講不明白了。
      回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2006-11-26 17:04 lingwj
    @emu
    這個(gè)方式實(shí)際用途不大,后臺(tái)的運(yùn)算用戶(hù)不希望看到多出的窗口,而且,現(xiàn)在的瀏覽器大多會(huì)自動(dòng)屏蔽javascript的運(yùn)行,如果還要用戶(hù)點(diǎn)擊許可運(yùn)行javascript運(yùn)行的話(huà),其效果可想而知  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2006-11-28 13:33 emu
    ;) 偶只是展示這樣一個(gè)計(jì)算,并不是在展示這樣一個(gè)顯示方式啊。
    現(xiàn)在的主流瀏覽器應(yīng)該沒(méi)有默認(rèn)自動(dòng)屏蔽javascript的運(yùn)行了吧?  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2006-12-28 10:04 putongren
    呵呵,學(xué)習(xí)!

    建議一下,可以在你的這段代碼中增加一些斷點(diǎn)支持功能,以便實(shí)現(xiàn)“線程”掛起、喚醒。線程的調(diào)度依然可以使用 setInterval。  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2006-12-28 17:09 emu
    我的例子中有啊,試試反復(fù)點(diǎn)擊按鈕啟動(dòng)多個(gè)測(cè)試“線程”,然后把鼠標(biāo)移動(dòng)到正在運(yùn)算中的“線程”上,它就會(huì)停下來(lái)。鼠標(biāo)移開(kāi)的時(shí)候它又繼續(xù)。  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2007-08-08 19:43 cnxmouse
    emu :
    花了幾個(gè)小時(shí),認(rèn)真看了一下你的程序,
    你的程序?qū)崿F(xiàn),我覺(jué)得不具有可用性,
    你的計(jì)算部分,已經(jīng)作了分割處理,每個(gè)計(jì)算周期非常短,所以實(shí)現(xiàn)了"多線程"的效果,但是在實(shí)際的應(yīng)用中,一個(gè)有實(shí)際用途的函數(shù)根本不可能這樣處理,如果人為的分割是非常難的,而且?guī)?lái)了很多的不確定性,特別對(duì)于變量的使用上根本無(wú)法控制,
    05年的時(shí)候?yàn)榱私鉀Q頁(yè)面效果,曾經(jīng)也嘗試讓JS多線程,使用的是setTimeout,實(shí)現(xiàn)了一點(diǎn)的效果,但是我的本意"多線程"沒(méi)有實(shí)現(xiàn).今年再回首,老問(wèn)題依舊...
      回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2007-08-17 16:57 小西
    to emu:
    跑了一下,好欣喜,再仔細(xì)看了一下程序,卻有些失望~

    如果光看運(yùn)行效果,再結(jié)合這里“用Command模式模擬多線程”的標(biāo)題,我還以為那n個(gè)閃動(dòng)的運(yùn)算是發(fā)生在n個(gè)固定的div標(biāo)簽和n個(gè)固定的命令對(duì)象上,每個(gè)命令對(duì)象各自完成自己的 "1到1000連加" 的任務(wù),并把任務(wù)的執(zhí)行過(guò)程顯示到div中

    結(jié)果,一看代碼,只猜對(duì)三分之一!!!

    根本不是固定的命令對(duì)象,輪占時(shí)間片去完成各自的“命令”,而是把一個(gè)單純的命令分解成1000個(gè)“小命令”(每個(gè)小命令為了模擬大命令又會(huì)自己產(chǎn)生后繼小命令),然后把它們逐一丟進(jìn)一個(gè)公共的“閥門(mén)”,這個(gè)閥門(mén)還做得挺巧妙,一進(jìn)一出的,活生生的把人家的Array整成了“隊(duì)列”,最后每隔一毫秒反復(fù)地去“檢查”這個(gè)“閥門(mén)”里面的東西,滿(mǎn)足條件的,就把那個(gè)分解了的“小命令”執(zhí)行掉,不滿(mǎn)足,就又塞回閥門(mén)里。。。


    說(shuō)設(shè)計(jì)模式吧,人家那是為了簡(jiǎn)化,清晰化業(yè)務(wù)模型的代碼實(shí)現(xiàn)啊,可是你這的代碼,活生生地把業(yè)務(wù)拆解了,把業(yè)務(wù)給復(fù)雜化了,然后才成全了你的“多線程”。。

    自以為很聰明的實(shí)現(xiàn),實(shí)際上真的很難推廣開(kāi)來(lái)
    你看看你的function(){simThread(...)}對(duì)象,在循環(huán)和嵌套中反反復(fù)復(fù)構(gòu)造了多少次? 再看看你那些內(nèi)嵌函數(shù)因?yàn)榻壎送獠亢瘮?shù)的本地變量而產(chǎn)生的閉包,內(nèi)存有泄漏嗎?變量好控制嗎?

    你的實(shí)現(xiàn),根本不是用命令對(duì)象模擬多線程,本質(zhì)上就是用for循環(huán)模擬多線程!!!你的本質(zhì)就是把最清晰的業(yè)務(wù)命令,從代碼的角度分解成了更小的,更不好控制的,只有你自己懂的“命令對(duì)象”,你這種做法純粹是偷換概念,吸引眼球!!!!難怪樓上有些人說(shuō)不實(shí)用呢 ,真的不實(shí)用,絲毫沒(méi)有從本質(zhì)上解決問(wèn)題。





      回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2007-08-17 18:12 emu
    偶從來(lái)沒(méi)有說(shuō)過(guò)模擬多線程問(wèn)題或者大計(jì)算量造成瀏覽器失去響應(yīng)問(wèn)題用command模式就可以很漂亮地輕松解決了,只是演示了如何這樣做的一個(gè)方法而已。樓上各位看來(lái)對(duì)偶的期望太高了。

    javascript作為一個(gè)單進(jìn)程的解釋語(yǔ)言,“活生生地把業(yè)務(wù)拆解了”恐怕是避免長(zhǎng)時(shí)間持續(xù)運(yùn)算導(dǎo)致瀏覽器失去響應(yīng)的惟一出路了。command模式提供給了我們一個(gè)可能的分解計(jì)算的方式。同時(shí)把計(jì)算分解后也讓多個(gè)模擬線程并行計(jì)算和按需要調(diào)度提供了可能。

    樓上的最后一段偶是不同意的,用“for循環(huán)模擬多線程”是說(shuō)不通的。executeCommands中的for循環(huán)是一個(gè)合理的進(jìn)程調(diào)度的可能實(shí)現(xiàn)方式。

    偶還想更正一下樓上對(duì)于設(shè)計(jì)模式的誤解。“說(shuō)設(shè)計(jì)模式吧,人家那是為了簡(jiǎn)化,清晰化業(yè)務(wù)模型的代碼實(shí)現(xiàn)啊”這是樓上自己對(duì)設(shè)計(jì)模式的理解而已。設(shè)計(jì)模式是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類(lèi)編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié),它并不背負(fù)有“簡(jiǎn)化,清晰化業(yè)務(wù)模型”的使命,雖然有的時(shí)候它看起來(lái)確實(shí)有這樣的效果。舉個(gè)最常見(jiàn)的例子,用對(duì)象池方式來(lái)處理數(shù)據(jù)庫(kù)連接(連接池),肯定要比每次訪問(wèn)數(shù)據(jù)庫(kù)都創(chuàng)建連接,用完關(guān)閉連接,來(lái)得不“簡(jiǎn)化”,不“清晰”,而且?guī)?lái)了很多原來(lái)不曾存在的極其麻煩的問(wèn)題,但是它能有效提高效率,節(jié)省資源,因此除了初學(xué)者,我們幾乎從來(lái)不會(huì)嘗試每次訪問(wèn)數(shù)據(jù)庫(kù)都去創(chuàng)建連接。

    用復(fù)雜化了業(yè)務(wù)邏輯來(lái)指責(zé)偶使用command模式的方式,就好像去指責(zé)連接池是復(fù)雜化了數(shù)據(jù)庫(kù)訪問(wèn)的業(yè)務(wù)邏輯一樣,是置我們解決了的問(wèn)題于不顧,而只著眼于我們付出的代價(jià)。其實(shí)我們提供一個(gè)問(wèn)題的解決方案的時(shí)候,一般并不意味著發(fā)明了銀彈。

    說(shuō)偶偷換概念,吸引眼球,偶就實(shí)在是很無(wú)語(yǔ)了,分享一點(diǎn)技術(shù)心得用得著扣這么大的帽子給偶嘛?在樓上諸位提出更漂亮的實(shí)現(xiàn)之前,這是偶目前的技術(shù)能力做能做到的最漂亮的實(shí)現(xiàn)了,難道是特地發(fā)出來(lái)害人的?難道寫(xiě)blog有人給稿費(fèi)的?  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2007-10-26 15:27 Little燕
    偶這段時(shí)間也在整js多線程的問(wèn)題,不經(jīng)意看到了樓主的這篇文章,覺(jué)得還不錯(cuò),雖然實(shí)用性不是很好(呵呵,我的個(gè)人意見(jiàn)!),但還是可以學(xué)習(xí)一下啦!  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2007-12-14 18:57 neetoo
    似乎也只有這種準(zhǔn)異步方式了  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2007-12-18 16:35 emu
    除非打開(kāi)獨(dú)立的新窗口來(lái)進(jìn)行計(jì)算。
    內(nèi)嵌的框架似乎是在同一個(gè)線程上跑的,獨(dú)立的新窗口根據(jù)系統(tǒng)設(shè)置可以在獨(dú)立的線程或者進(jìn)程上跑(優(yōu)化大師有這個(gè)設(shè)置項(xiàng)),如果有多核的話(huà)似乎還可以在不同的核上跑。  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2008-03-03 22:40 游客
    能不能同時(shí)彈出一大堆窗口呢?用alert().  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2008-03-04 12:32 游客
    有一個(gè)函數(shù)要執(zhí)行3組for循環(huán),每組250多次,循環(huán)后有延遲的現(xiàn)象,所以想用多線程將循環(huán)分成多個(gè)函數(shù)同時(shí)執(zhí)行,如果能同時(shí)彈出多個(gè)alert窗口,那證明多線程是成功的,試了下用settimeout與setinterval都不行,不知前輩有無(wú)可行的方法?  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2008-03-08 21:04 emu
    呵呵我前面說(shuō)過(guò)了,真正的多線程目前還不能實(shí)現(xiàn)(期待未來(lái)的瀏覽器吧)。至于同時(shí)彈出多個(gè)alert窗口并不難,也證明不了多線程。下面的代碼在我的機(jī)器上可以同時(shí)彈出來(lái)若干個(gè)alert。試試不要點(diǎn)確定,直接把前面的拖開(kāi):)
    var a=0;
    for(var i=0;i<10;i++){
    var x=new ActiveXObject("Microsoft.XMLHTTP");
    x.onreadystatechange=function(xx){return function(){if(xx.readyState==4)alert(a++)}}(x)
    x.open("get","http://127.0.0.1:44444",true);
    x.send("")
    }
    本地44444端口上沒(méi)有開(kāi)任何服務(wù)的情況下測(cè)試的。
      回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2008-03-11 19:36 游客
    看來(lái)這js還真不能實(shí)現(xiàn)多線程呢.
    你最開(kāi)始寫(xiě)的代碼的文本域內(nèi)有行號(hào)顯示,怎么實(shí)現(xiàn)的?
    有一個(gè)問(wèn)題困擾了我很久了,如果要在js代碼里建立事件監(jiān)聽(tīng)該如何實(shí)現(xiàn)?我知道的只有兩個(gè)方法:在對(duì)象里加<div id="id" onkeydown=""></div>;還有一個(gè)<script type="text/javascript" for="id" event="onclick">alert();</script>
    如果不用這兩個(gè)還有其它方法嗎?比如在<script type="text/javascript">事件</script>里面加事件監(jiān)聽(tīng).我能想到的都試過(guò)了,沒(méi)有效果.前輩在js方面有很高深的造詣,相信你會(huì)有辦法的.  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2008-03-12 01:29 emu
    不知道你指的是不是addEventListener/attachEvent這樣的?
    onXXX句柄很多也可以直接賦值的,事件名全小寫(xiě)就好了。  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2008-03-12 20:11 游客
    找了一些attachEvent與addEventListener的介紹文章,用以下的實(shí)例試了下,沒(méi)有效果,
    var obj=document.getElementById("body");
    obj.attachEvent("onload",alert(5));
    能不能給個(gè)具體的實(shí)例方案?

    問(wèn)一下網(wǎng)頁(yè)加密的問(wèn)題,如果是普通的加密,網(wǎng)絡(luò)上有很多在線加解密的工具,請(qǐng)問(wèn)能否在為網(wǎng)頁(yè)加密時(shí)加密碼而瀏覽器又能打開(kāi)?

    在網(wǎng)上找到的一個(gè)用MD5加密的工具,但是在源碼里可以看到密碼,源碼太長(zhǎng)了,粘不上來(lái).

    http://www.cha88.cn
      回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2008-03-13 14:24 emu
    呵呵網(wǎng)上能查得到答案的問(wèn)題不要那么懶了。  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2008-05-16 17:37 A Java DEV
    寫(xiě)得很好,
    這里提出了個(gè)線程設(shè)計(jì)模式,
    巧妙堆棧的設(shè)計(jì),獨(dú)立的處理對(duì)象 function.
    當(dāng)然一些公用變量的用地要小心
    線程的執(zhí)行,時(shí)序是很關(guān)鍵的
    數(shù)據(jù)共享 和 數(shù)據(jù)分離,是要解決的關(guān)鍵問(wèn)題
    其實(shí)大多數(shù)這些數(shù)據(jù)是要靠developer來(lái)提取和分離的
    這里的代碼反應(yīng)了一個(gè)正確的線程執(zhí)行模式!我支持!  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程[未登錄](méi) 2008-05-20 16:52 TY
    對(duì)內(nèi)容了解遲了一些,但覺(jué)得內(nèi)容比較新。
    學(xué)習(xí)中。  回復(fù)  更多評(píng)論
      

    # re: 在javascript中用command模式模擬多線程 2008-08-13 11:01 wudale
    樓主的代碼,只能說(shuō)從視覺(jué)效果上實(shí)現(xiàn)了多線程而已,適用范圍非常有限。大家去看看 Concurrent.Thread.js 這個(gè)javascript 多線程框架吧,是個(gè)日本人開(kāi)發(fā)的,我剛剛知道這東西,還沒(méi)仔細(xì)研究他的代碼,的確是個(gè)好東西。  回復(fù)  更多評(píng)論
      


    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲成AV人片在线观看ww| **aaaaa毛片免费| 亚洲AⅤ永久无码精品AA| 亚洲最大的成人网站| 成年人性生活免费视频| 亚洲中文字幕无码一去台湾| 美女视频黄的全免费视频| 久久久国产亚洲精品| 午夜电影免费观看| 男男gvh肉在线观看免费| 免费人成激情视频| 黄桃AV无码免费一区二区三区| 亚洲精品国产福利一二区| www一区二区www免费| 久久亚洲精品视频| 99久久免费中文字幕精品| 亚洲欧洲国产精品久久| 成全视频免费高清| 免费无码婬片aaa直播表情| 亚洲人成网7777777国产| 69免费视频大片| 亚洲日本天堂在线| 人人狠狠综合久久亚洲高清| 黄床大片免费30分钟国产精品| 亚洲午夜久久久影院伊人| 最近中文字幕mv免费高清视频8 | AA免费观看的1000部电影| 亚洲国产美女精品久久久| 亚洲片国产一区一级在线观看 | 亚洲人成网77777色在线播放| 日韩午夜理论免费TV影院| 色老板亚洲视频免在线观| av无码东京热亚洲男人的天堂 | 免费国产成人高清在线观看网站 | 久久乐国产综合亚洲精品| 免费日韩在线视频| 一个人免费日韩不卡视频| jizzjizz亚洲日本少妇| 久久久无码精品亚洲日韩蜜桃| 国内自产拍自a免费毛片| 99re6在线精品免费观看|