5

我正在创建一个节点 C++ 插件,它应该回调一个 js 函数,因为事件是由不受我控制的其他线程触发的(它实际上是来自我使用的托管 dll 的 .net 线程)。由于 JS 世界是单线程的,我不能只保留 js 函数引用并从非 js 线程调用它。我什至无法创建要传递给该线程上的回调函数的参数。

我已经看到uv_queue_work在您想要将工作从 js 线程中移出并且一旦完成并从 js 线程回调以执行您需要对其执行的任何操作的情况下使用,例如回调 js 函数。

供以后参考,这是该函数的签名:

int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb,
uv_after_work_cb after_work_cb);

调用 uv_queue_work 对于一次性工作来说很好,我可能会通过链接对uv_queue_workfrom的调用来任意调用我after_work_cb,同时work_cb与另一个线程同步,但我想知道是否没有更直接的方法来做到这一点。

就像 node.js 提供的 fn 一样,它可以被任何其他线程直接调用,fn 指针指向下一次要在主 js 线程上执行的代码。任何的想法?

4

1 回答 1

7

而不是使用 uv_queue_work,您应该查看 uv_async_* 函数(查看https://github.com/joyent/libuv/blob/master/include/uv.h)。

可以在节点 sqllite 项目https://github.com/developmentseed/node-sqlite3/blob/master/src/async.h中找到一个非常好的实现。

但是请注意,如果您对这些东西不非常小心,您最终会遇到一些可怕的循环引用计数错误(应用程序提前退出,或者根本不退出)

于 2012-07-09T08:41:28.537 回答