2010-12-12 34 views
0

メインページにvarがあり、このvarを設定しようとしているワーカースレッドがある場合、ページにアクセスできる方法はありますか?すべてが同期していると仮定しますか?この場合javascript Webワーカー - データをページスレッドに渡す

var routeWorker = new Worker('getroute.js'); 
var checkPatrolRouteFoundTimer; 
var rw_resultRoute; 
var routeFound = false; 

routeWorker.onmessage = function(e) { 
     rw_resultRoute = e.data.route; 
     routeFound = true; 
} 

function checkPatrolReady() { 
if(!routeFound) 
    checkPatrolRouteFoundTimer = setTimeout("checkPatrolReady()", 1000); 
} 

function ForcePatrol(index) { 
routeWorker.postMessage(index); 
    checkPatrolReady(); 
    ... 
    //do work on route 
    ... 
} 

、私が話しているvarがrw_resultRouteある、と私はデバッグ時に、それが正しくセットされます見ることができます。しかし、唯一のことは、ワーカースレッドで設定されていることであり、ページスレッドでは設定されていないことです。

私は、予想通りにForcePatrol()メソッドを流れ、作業者が終了した後にrouteFoundがtrueに評価されるため、rw_resultRouteが設定されているように見えます。

技術的には、routeFoundはワーカーによって設定され、ページスレッドによって読み取られるためrw_resultRouteにはワーカーのみがアクセスできるので意味がありません。

これが可能であれば、alert()メッセージの表示やページのHTMLの更新以外のワーカースレッドの目的はありません。

答えて

0

私はこの問題を解決しました。私が正しくやっていなかった同期がありました。私は間違った方法でsetTimeoutを使用していました。

var routeWorker = new Worker('getroute.js'); 
var checkPatrolRouteFoundTimer; 
var rw_resultRoute; 
var routeFound = false; 

routeWorker.onmessage = function(e) { 
    rw_resultRoute = e.data.route; 
    routeFound = true; 
} 

function checkPatrolReady() { 
    if(routeFound) { 
     ... 
     //do work on route 
     ... 
     clearInterval(checkPatrolRouteFoundTimer); 
    } else { 
     // do any maint here? 
    } 
} 

function ForcePatrol(index) { 
    routeWorker.postMessage(index); 
    checkPatrolRouteFoundTimer = setInterval("checkPatrolReady()", 1000); 
} 

のsetTimeout /のsetIntervalへの呼び出しを介して流れ、最初の例では、私は代わりのsetIntervalのsetTimeoutメソッドを使用していました。

新しい方法で、ForcePatrolを呼び出すとタイマーが設定され、checkPatrolReady()はフラグを評価し、作業を行い、タイマーが真であればクリアします。

実際にWebワーカーから結果を得るのは面白いことではありませんが、基本的にはワーカーの結果と競合状態を作り出していました。

0

本当にこれが可能であることを望みます。それ以外の場合、alert()メッセージの表示やページのHTMLの更新以外のワーカースレッドの目的はありません。

通常、ブラウザをロックする処理を処理するためのものです。キャンバスと実行中のハッシングのための数値の処理に最適です。この場合

、私が話しているvarがrw_resultRouteある、と私はデバッグ時に、それが正しくセットされます見ることができます。しかし、唯一のことは、ワーカースレッドで設定されていることであり、ページスレッドでは設定されていないことです。

ワーカーはそれを生成するページとは別です。データを渡す唯一の方法はメッセージングです。 postMessageでデータを送信し、その結果をonMessageで処理する必要があります。異なるものを扱う場合は、異なるメッセージタイプを処理するswitch文を設定します。

+0

OK、同意します。しかし、私はまだ、ページがナンバー・クランチングの結果にどのようにアクセスするのかという疑問があると思う。私の意見では、キャンバスのようにページHTMLに直接適用されない限り、そのデータはワーカースレッドに残っています。 – Stevus

+0

「ページがどのようにリルにアクセスするか」私が言及したように、それはpostMessageとonMessageで行われます。ワーカーからのデータをクライアントに戻し、必要に応じてデータを使用します。 https://developer.mozilla.org/En/Using_web_workersでサンプルをご覧ください。 – epascarello

関連する問題