0

这是我想向各位天才程序员们总结的问题:我有一个用 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
    }

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

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

谢谢你的帮助

4

1 回答 1

0

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

但是,如果您不介意编写更多的 C++,那么您可以做一些笨拙的事情并让某些东西正常工作:

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

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

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

于 2016-04-24T08:33:58.057 回答