【发布时间】: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