Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无需onmessage的web工作者通信_Javascript_Multithreading_Synchronous_Web Worker_Web Container - Fatal编程技术网

Javascript 无需onmessage的web工作者通信

Javascript 无需onmessage的web工作者通信,javascript,multithreading,synchronous,web-worker,web-container,Javascript,Multithreading,Synchronous,Web Worker,Web Container,以下是我想向你们这些天才程序员提出的问题: 我有一个用C++编写的自定义Web容器,可以与JavaScript通信。 从C++到JS,可以实现同步的JS函数调用 从JS到C++,它可以实现异步C++函数调用< /P> 有了这些工具,我必须执行一个从JS到C++的同步调用。。。 由于我不能使用消息通信系统(因为它意味着主线程上的异步性,除非我遗漏了什么),所以我的第一个猜测是使用工作线程 “main.js”文件 “demo_workers.js”文件 不幸的是,无法从工作线程访问synctools

以下是我想向你们这些天才程序员提出的问题: 我有一个用C++编写的自定义Web容器,可以与JavaScript通信。 从C++到JS,可以实现同步的JS函数调用 从JS到C++,它可以实现异步C++函数调用< /P> 有了这些工具,我必须执行一个从JS到C++的同步调用。。。 由于我不能使用消息通信系统(因为它意味着主线程上的异步性,除非我遗漏了什么),所以我的第一个猜测是使用工作线程

“main.js”文件

“demo_workers.js”文件

不幸的是,无法从工作线程访问synctools和syncdata。 这里有几个问题:

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

谢谢你的帮助

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

<>如果你不介意写更多的C++,那么你可以做一些笨拙的事情来工作:

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

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


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

从我在web worker中看到的情况来看,它在如何使用它方面受到了有意的限制。只允许将副本传递到工作线程,而不允许在线程之间共享资源。因此,您可以将synctools和syncdata作为参数传递,但如果在一个线程上操作它,则在另一个线程上看不到更改。但是,如果只需要工作线程对其进行操作并将其传递回主线程,则可以使用postMessage()实现这一点。确切地说,什么是
CallCPPFile
?。。和入口点函数来确定向哪个资源发送http请求?@dustmouse:postMessage不是一个选项,因为我无法将发布的消息接收到主js文件中,因为它正在循环。如果我选择了循环,我会松开同步性,也就是说JavaScript返回,而C++在另一个线程上继续它的work@Brett不,这只是容器在JS和C++之间进行通信的方式。CalcppFrm是一个函数,它将数据传递给C++,调用特定函数到C++代码中。C++完成调用BAKC时,JS回调作为参数传递。不幸的是,我没有修改C++的权利,让我换一句话,这个通信的上下文是什么?。。它是使用http的请求和响应吗?。。同步XMLHttpRequest对象是否可行<代码>xhr.open(方法、资源、异步标志)
    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
    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
    }