0

вот проблема, которую я хочу укусить вам, одаренные кодеры: У меня есть пользовательский веб-контейнер, написанный на C++, который может общаться с javascript. от C++ для JS он может сделать синхронную функцию JS называет От JS в C++ это может сделать асинхронный C++ функция вызываетвеб-сотрудник связи без onmessage

С помощью этих инструментов, я должен сделать синхронный вызов от JS в C++ ... As Я не могу использовать систему обмена сообщениями (потому что оно подразумевает асинхронность в главном потоке, если я не пропустить что-то), мое первое предположение было использовать рабочий поток

«main.js» файл

var synctools = false; 
    var syncdata =""; 
    var myworker=new worker("demo_workers.js"); 
    while(synctool == false){} //It s ugly but i haven t had any other ideas 

«demo_workers .js "файл

CallCPPFile(param,callback); //call the c++ and c++ call callback when finished 
    function callback(data) 
    { 
     //do stuff 
     syncdata = data; 
     synctools = true; //this is supposed to stop the looping of the main js 
    } 

К сожалению, synctools и syncdata недоступны из рабочего потока. Итак, вот несколько вопросов:

  • есть ли другой способ связи между работником и основной нитью? Я попытался использовать объект навигатора, но он, похоже, тоже не работает (я не знаю, является ли его одним и тем же объектом навигатора между двумя потоками)
  • Помимо веб-рабочего, вы видите другой способ, которым я могу достичь своей цели ? (Я пытался обещание тоже не повезло)

Спасибо за вашу помощь

+0

Из того, что я видел с веб-работником, он целенаправленно ограничен тем, как вы можете его использовать. Только позволяет передавать копии в рабочий поток и не распределять ресурсы между потоками.Таким образом, вы можете передавать synctools и syncdata в качестве параметров, но если вы будете манипулировать им в одном потоке, вы не увидите изменений в другом потоке. Но если вам нужно только обработать рабочий поток и передать его обратно в основной поток, вы можете выполнить это с помощью postMessage(). – lintmouse

+0

Что такое 'CallCPPFile' точно? .. и функция точки входа для определения того, какой ресурс должен отправлять HTTP-запрос? –

+0

@ dustmouse: postMessage не является вариантом, поскольку я не могу получить отправленное сообщение в основной файл js, потому что он зацикливается. И если я прохожу цикл, я теряю синхронность, как возвращение javascript, а C++, в другом потоке, продолжает свою работу. –

ответ

0

Вот гайки и болты вашей проблемы. Синхронизация в асинхронной системе требует взаимодействия обеих сторон. Ваша проблема заключается в том, что часть кода, работающая в полной изоляции, не может обновлять какие-либо данные, если только она не делает этого сама. Поскольку все потоки JavaScript полностью изолированы друг от друга, если вы не пишете какой-либо внешний вызываемый, который может вас ждать, тогда вы застряли. Для решения этой проблемы нет чисто JavaScript решения.

Если, однако, вы не возражаете писать еще немного C++, то вы можете сделать что-то неуклюжее и получить что-то работу:

Создание многопоточного мини-сервер HTML. Создайте сервер для ввода идентификатора (предоставленного вызывающим абонентом) в качестве параметра, создайте точку хранения данных и подождите. Создайте сервер для ввода идентификатора и данных в качестве параметров. При приеме параметра данных устанавливается точка хранения, связанная с принятым идентификатором, и ожидание, связанное с идентификатором, удаляется.

Это позволяет 1 javascript потоку ждать в другом потоке с синхронным запросом AJAX. Единственное требование состоит в том, что поток ожидания использует postMessage для отправки идентификатора ожидания в поток назначения перед ожиданием.

С другой стороны, что-то подобное можно сделать также в чистом javascript, если вы можете создать HTTP-сервер в отдельном потоке. Трюк будет поддерживать соединение http до тех пор, пока ответ не будет готов. Все зависит от того, в какой среде JavaScript вы работаете.

Смежные вопросы