Javascript 无需onmessage的web工作者通信
以下是我想向你们这些天才程序员提出的问题: 我有一个用C++编写的自定义Web容器,可以与JavaScript通信。 从C++到JS,可以实现同步的JS函数调用 从JS到C++,它可以实现异步C++函数调用< /P> 有了这些工具,我必须执行一个从JS到C++的同步调用。。。 由于我不能使用消息通信系统(因为它意味着主线程上的异步性,除非我遗漏了什么),所以我的第一个猜测是使用工作线程 “main.js”文件 “demo_workers.js”文件 不幸的是,无法从工作线程访问synctools和syncdata。 这里有几个问题: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
- 工作线程和主线程之间是否有其他通信方法?我曾尝试使用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
}