【问题标题】:web worker comunication without onmessage没有 onmessage 的 web worker 通信
【发布时间】:2015-03-23 20:12:46
【问题描述】:

这是我想向各位天才编码员提出的问题: 我有一个用 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
    }

不幸的是,工作线程无法访问同步工具和同步数据。 所以这里有几个问题:

  • 工作线程和主线程之间是否有另一种通信方法?我曾尝试使用 navigator 对象,但它似乎也不起作用(我不知道它是否在两个线程之间使用相同的 navigator 对象)
  • 除了 web worker,你还有其他方法可以实现我的目标吗? (我也尝试过承诺,但没有运气)

感谢您的帮助

【问题讨论】:

  • 从我在 web worker 中看到的情况来看,它在使用方式上受到了非常严格的限制。仅允许您将副本传递到工作线程中,并且线程之间不共享资源。因此,您可以将synctools 和syncdata 作为参数传递,但如果您在一个线程上操作它,您将看不到另一个线程上的更改。但是,如果您只需要让工作线程对其进行操作并将其传递回主线程,则可以使用 postMessage() 来完成。
  • CallCPPFile 到底是什么?.. 以及确定将 http 请求发送到哪个资源的入口点函数?
  • @dustmouse:postMessage 不是一个选项,因为我无法将发布的消息接收到主 js 文件中,因为它正在循环。如果我停止循环,我会失去同步性,即 javascript 返回,而 C++ 在另一个线程上继续工作
  • @Brett 不,这只是容器在 JS 和 C++ 之间进行通信的方式。 CallCPPFile 是向 C++ 传递数据的函数的名称,将特定函数调用到 C++ 代码中。并且 C++ 完成后调用 bakc 作为参数传递的 js 回调。不幸的是,我无权修改 C++
  • 让我重新表述一下,这种通信的上下文是什么?...它是使用 http 的请求和响应吗?.. 同步 XMLHttpRequest 对象是否可行? xhr.open(method, resource, asyncflag)

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


【解决方案1】:

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

但是,如果您不介意编写更多 C++,那么您可以做一些笨拙的事情并得到一些工作:

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

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

再想一想,只要您可以在单独的线程中创建一个 http 服务器,这样的事情也可以在纯 javascript 中完成。诀窍是保持 http 连接打开,直到响应准备好。这完全取决于您在哪种 JavaScript 环境中工作。

【讨论】:

    猜你喜欢
    • 2019-05-16
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    相关资源
    最近更新 更多