没有onmessage的web worker通信

时间:2015-03-23 20:12:47

标签: javascript multithreading synchronous web-worker web-container

这是我想向你们的天才编码员汇总的问题: 我有一个用C ++编写的自定义Web容器,可以与javascript通信。 从C ++到JS,它可以执行同步JS函数调用 从JS到C ++,它可以进行异步C ++函数调用

使用这些工具,我必须进行从JS到C ++的同步调用 ... 因为我不能使用消息通信系统(因为它暗示主线程上的异步性,除非我错过了什么),我的第一个猜测是使用工作线程

“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。 所以这里有几个问题:

  • 工作者和主线程之间还有另一种通信方法吗?我试图使用导航器对象,但它似乎也无法工作(我不知道它是否在两个线程之间是相同的导航器对象)
  • 除了网络工作者,您是否看到了我可以实现目标的另一种方式? (我也没有运气也尝试过承诺)

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

这是你问题的基本要点。异步系统中的同步需要双方合作。您的问题是,完全隔离的一段代码不能更新任何数据,除非它自己这样做。由于所有JavaScript线程彼此完全隔离,除非您编写某种可以等待您的外部可调用线程,否则您将陷入困境。这个问题没有纯粹的JavaScript解决方案。

但是,如果你不介意再编写一些C ++,那么你可以做一些笨拙的事情并让事情发挥作用:

创建一个多线程迷你html服务器。 设计服务器以获取id(由调用者提供)作为参数,为数据创建存储点并等待。 设计服务器以获取id和data作为参数。接收数据参数时,将设置与接收到的ID关联的存储点,并删除与该ID关联的等待。

这允许1个javascript线程在具有同步AJAX请求的另一个线程上等待。唯一的要求是等待线程使用postMessage在等待之前将等待ID发送到目标线程。

第二个想法,只要你可以在一个单独的线程中创建一个http服务器,这样的事情也可以在纯JavaScript中完成。诀窍是保持http连接打开,直到响应准备就绪。这完全取决于您正在使用的JavaScript环境。