2012-06-13 154 views
0

我想在java脚本中使用settimeout模拟一个简单的后台线程。问题setinterval/settimeout

function ThreadManager(timer){ 
var threadID=1; 
if(timer) 
    this.frequency=timer; 
else 
    this.frequency=10; 
} 
ThreadManager.prototype.frequency; 
ThreadManager.prototype.process; 
ThreadManager.prototype.kill; 
ThreadManager.prototype.add=function(thread) 
{ 
     this.process=new Process(thread,this.threadID++); 

} 
ThreadManager.prototype.run=function(parent) 
{ 
    if(!parent) 
     parent=this; 
    try{ 
     var st=parent.process.getNextStatement(); 
     if(st==null){ 
      if(parent.kill) 
       clearInterval(parent.kill) 
      return; 
     } 
     else 
      eval(st.trim()); 
    } 
    catch(err) 
    { 
     console.error(err); 
    } 
    if(st!=null&&!parent.kill) 
    { 
     parent.kill=setInterval(function(){parent.run(parent)},parent.frequency); 
    } 
} 
function Process(fun,id) 
{ 
    statements=getStatements(fun); 
    var threadID=id; 
    function getStatements(fun) 
    { 
     if(!fun) 
     { 
      return statements; 
     } 
     var functionString=(""+fun).trim(); 
     var start=functionString.indexOf("{"); 
     functionString=functionString.substring(start,functionString.length-1); 
     var regx=new RegExp("[\n;]"); 
     return functionString.split(regx); 
    } 

} 
Process.prototype.statements; 
Process.prototype.getNextStatement=function() 
{ 
     var cursor=statements.pop();; 
     while(cursor==null||cursor==""||cursor=='}'||cursor=="{") 
      cursor=statements.pop(); 
     return cursor; 
} 
function write(text) 
{ 
    doc=document.getElementById("note"); 
    note.innerHTML+=text+"<br\>" 
} 
function f1() 
{ 
    write("a"); 
    write("a"); 
    write("a"); 
} 
function f2() 
{ 
    write("b"); 
    write("b"); 
    write("b"); 
    write("b"); 
} 
function test() 
{ 
    write("hii"); 
    var thread=new ThreadManager(500); 
    thread.add(f1); 
    thread.run(); 
    var thread2=new ThreadManager(500); 
    thread2.add(f2); 
    thread2.run() 

} 

入口点函数试验(+),将来自具有与ID为“音符”一个div一个html文件的身体onload事件被调用。我期望得到像b a b a b b这样的输出。 但Mozilla给出了一个b b b(并在此之后得到挂起) 而铬给b b b b(和挂起)。 任何人都可以找出我的代码的问题?

回答

0

parent.run(parent)是一个循环引用,导致堆栈溢出。定时器为asynchronous,除非queue是为此目的而构建的,否则将不会顺序运行。