2013-08-15 3 views
0

소수를 찾기 위해 해결책을 찾고 있는데 한 가지 문제 외에는 모든 것이 정상입니다. 웹 근로자 파일에서 i == 373 & & j == 15에서 중지됩니다. 내 HTML 페이지가 사라지고 페이지를 새로 고친 후 실행을 다시 시작할 수 있습니다. 그러나 입력 매개 변수는 동일하며 (localStorage에 저장됩니다) 나에게 미친 짓이됩니다. 약간의 시간이 지나면 다시 실행을 멈추고 html 요소가 사라집니다. 또한 콘솔의 js도 작동하지 않습니다. 오류가 없습니다. 잃어 버렸습니다. 고맙습니다.Html 요소가 스크립트 실행시 숨김

MAIN.JS

var db = openDatabase("primeNumbers", "0.1", "Prime numbers db", 200000); 
    db.transaction(function (tx) { 
     tx.executeSql("CREATE TABLE IF NOT EXISTS primeNumbers (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, value INTEGER NOT NULL UNIQUE)", [], null, null); 
    }); 
    var settings = {}; 
    prepareData(); 

    $(document).ready(function() { 
     $('#start_button').click(function() { 
     toggleButton(); 
     }); 
     $('#show_table_button').click(function() { 
     showTableButton(); 
     }); 
     $('#show_canvas_image_button').click(function() { 
     showCanvas(); 
     }); 
    }); 

    //check if db can be used 
    if(!db){alert("Failed to connect to database.");} 

    var currNumber = 2; 
    var work; 

    var worker = new Worker('js/worker.js');//(blobURL); 

    //worker event listener 
    worker.onmessage = function(event) { 
     (event.data != undefined) && (settings.bFlag = true); 
     finder(true); 
    }; 

function finder(again) { 
    if(settings.j == 14 && settings.i == 373) { 
    console.log('70'); 
    }; 
    if(again) { 
    if (settings.bFlag){ 
     settings.j = 0; 
     if (settings.iShag == 3){ 
     settings.i+=4; 
     settings.iShag = 0; 
     } else { 
     settings.i+=2; 
     settings.iShag++; 
     }; 
     iSquare = Math.floor(Math.sqrt(settings.i)); 
     settings.bFlag = false; 
    }; 
    settings.j++; 
    }; 
    storeTempData(); 
    work && worker.postMessage('{\"i\":\"'+settings.i+'\",\"j\":\"'+settings.j+'\"}'); 
}; 

function toggleButton() { 
    btn = $('#start_button'); 
    if(btn.text() != 'pause_calculations') { 
    btn.text('pause_calculations'); 
    work = true; 
    finder(false); 
    } else { 
    btn.text('resume_calculations'); 
    work = false; 
    }; 
}; 

// table with data 
function showTableButton() { 
    //TODO: check if we can use this as parameter to function 
    btn = $('#show_table_button'); 
    if(btn.text() == 'show_calculated_data') { 
    btn.text('reload_table'); 
    renderTable(); 
    } else { 
    //TODO: implement it renderTable(); 
    }; 
}; 

var table_data; 

function renderTable() { 
    getBlockOfDataFromDb(function() { 
    $('#table_with_results').jqGrid({ 
     datatype: 'local', 
     data: table_data, 
     height: 230, 
     width: 350, 
     colNames: ['id', 'value'], 
     colModel: [ 
     { name: 'id', index: 'id', width: 20, sorttype: 'int', align: 'right' }, 
     { name: 'value', index: 'value', width: 20, sorttype: 'int', align: 'right'} 
     ], 
     multiselect: false, 
     caption: 'Prime numbers from db', 
     rowNum: 10, 
     pager: 'table_pager', 
     pagination: true, 
     gridview: true, 
     edit:false, 
     add:false, 
     del:false 
    }); 
    }); 
}; 

function getBlockOfDataFromDb(callback) { 
    var res = []; 
db.transaction(function(tx) { 
    tx.executeSql('SELECT * FROM primeNumbers', [], function(tx, result) { 
    result_length = result.rows.length; 
    for(var i = 0; i < result_length; i++) { 
     var json_obj = { id: result.rows.item(i).id, value: result.rows.item(i).value }; 
     res.push(json_obj); 
    }; 
    table_data = res; 
    callback(); 
    }); 
}); 
}; 

Array.prototype.contains = function(k) { 
    for(var p in this) 
     if(this[p] === k) 
      return true; 
    return false; 
}; 

function showCanvas() { 
    var primeArray = []; 
    var edge; 
    db.transaction(function(tx) { 
    tx.executeSql('SELECT * FROM primeNumbers', [], function(tx, result) { 
     result_length = result.rows.length; 
     for(var i = 0; i < result_length; i++) { 
     primeArray.push(parseInt(result.rows.item(i).value)); 
     }; 
     edge = parseInt(Math.sqrt(Math.max.apply(Math, primeArray))) + 1; 

     canv_div = $('#canvas_div'); 
     $('<canvas width="'+edge+'" height="'+edge+'" id="canvas_elem"></canvas>').appendTo(canv_div); 
     canv = $('#canvas_elem')[0]; 
     var context = canv.getContext('2d'); 
     var imgd = context.createImageData(edge,edge); 
     var pix = imgd.data; 
     var iter = 0; 
     for (var i = 0; n = pix.length, i < n; i += 4) { 
     pix[i] = 0; 
     if(primeArray.contains(iter)) { 
      pix[i+3] = 255; 
     } else { 
      pix[i+3] = 50; 
     }; 
     iter++; 
     } 
     context.putImageData(imgd, 0,0); 
    }); 
    }); 
}; 

function prepareData() { 

    var ls = localStorage; 

    if(ls.getItem('bFlag') && ls.getItem('i') && ls.getItem('j') && ls.getItem('iShag')) { 
    settings.bFlag = (ls.getItem('bFlag') === 'true'); 
    settings.i  = parseInt(ls.getItem('i')); 
    settings.j  = parseInt(ls.getItem('j')); 
    settings.iShag = parseInt(ls.getItem('iShag')); 
    } else { 
    settings.i  = 7; 
    settings.j  = 1; 
    settings.iShag = 0; 
    settings.bFlag = false; 
    db.transaction(function(tx) { 
     tx.executeSql('INSERT INTO primeNumbers (value) SELECT 2 AS value UNION SELECT 3 UNION SELECT 5'); 
    }); 
    }; 
}; 
function storeTempData() { 
    localStorage.setItem('i'  , settings.i); 
    localStorage.setItem('j'  , settings.j); 
    localStorage.setItem('bFlag' , settings.bFlag); 
    localStorage.setItem('iShag' , settings.iShag); 
}; 

또한 내

onmessage = function(event) { 
    data = JSON.parse(event.data); 
    i = parseInt(data['i']); 
    j = parseInt(data['j']); 
    iSquare = Math.floor(Math.sqrt(i)); 
    run(); 
}; 
function run() { 
    var db = openDatabase("primeNumbers", "0.1", "Prime numbers db", 200000); 
    db.transaction(function(tx) { 
    if(i == 373 && j == 15) { 
     1+1; 
    }; 
    tx.executeSql('SELECT value FROM primeNumbers WHERE id='+(j+1), [], function(tx, result) { 
     val = parseInt(result.rows.item(0)['value']); 
     if (i % val == 0){ 
     self.postMessage('bFlag'); 
     } else if (j >= iSquare) { 
     db.transaction(function(tx) { 
      tx.executeSql('INSERT INTO primeNumbers (value) VALUES ('+i+')', [], function() { 
      self.postMessage('bFlag'); 
      }); 
     }); 
     } else { 
     self.postMessage(); 
     }; 
    }, 
    function(tx, error) { 
     self.postMessage('Error processing SQL: ' + error); 
    }); 
    }, function(error) { 
    self.postMessage('Error processing Transaction: ' + error) 
    }); 
}; 

내가 어떤 아이디어에 행복 할 것이다 WORKER.JS. 아마도 smb는 오류를 잡는 방법이나 내가 크롬 프로파일 러에서 찾을 필요가있는 것을 알고 있습니다. 나는 프로시스로 비디오를 썼다. youtube

답변

0

문제가 해결되었습니다. 나는 SELECT 문장을 worker에서 main file로 옮겼다. DB에서 오류가 많아서 존재하지 않는 값 (알고리즘을 필요로 함)을 선택하려고 시도했을 때 문제가 작업자에서 오류를 처리하고 있다고 생각합니다.