2010-12-12 3 views
0

Если у меня есть var на моей главной странице и есть рабочий поток, пытающийся установить этот var, есть ли способ, к которому страница может получить к нему доступ? Предполагая, что все синхронизировано?javascript Web worker - передать данные на страницу темы

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 
    ... 
} 

в этом случае вар я говорю о rw_resultRoute, и я могу видеть это получить набор правильно при отладке. Но единственное, что он установлен в рабочем потоке, а не в потоке страницы.

Я прохожу через метод ForcePatrol() так, как я ожидаю, и похоже, что rw_resultRoute устанавливается, поскольку routeFound оценивает значение true после завершения работника.

Технически это не имеет смысла, так как 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 будет течь через и в первом примере я использовал SetTimeout вместо setInterval.

По новому способу вызов ForcePatrol будет настраивать таймер, а checkPatrolReady() будет оценивать флаг, выполнять работу и очищать таймер, если это правда.

Таким образом, действительно нет ничего необычного в получении результатов от веб-работников, но я по существу создавал условия гонки с результатами работника.

0

Я действительно надеюсь, что это возможно, в противном случае я не вижу цели для рабочих потоков, кроме отображения сообщений alert() и обновления страницы HTML.

Он предназначен для обработки обработки, которая обычно блокирует браузер. Отлично подходит для хрустания чисел для холста и хостинга.

в этом случае вар я говорю о rw_resultRoute, и я могу видеть это получить набор правильно при отладке. Но единственное, что он установлен в рабочем потоке, а не в потоке страницы.

Работник отдельно от страницы, которая порождает его. Единственный способ передачи данных - обмен сообщениями. Вам необходимо отправить данные с помощью postMessage и обработать результат обработкой onMessage. Если вы обрабатываете разные вещи, настройте оператор switch для обработки разных типов сообщений.

+0

Хорошо, согласовано. Но я все еще думаю, что вопрос о том, как страница обращается к результатам числа хруст. На мой взгляд, эти данные все еще находятся в рабочем потоке, если только они не применяются непосредственно к HTML-странице, как холст. – Stevus

+0

«как страница доступа к повторению» Это делается с postMessage и onMessage, как я уже упоминал. Вы возвращаете данные от рабочего обратно клиенту, и вы все равно используете данные. Пройдите здесь: https://developer.mozilla.org/En/Using_web_workers – epascarello