5

我正在尝试为 C++ 库编写 nodejs 绑定,但我似乎遇到了障碍。

我正在尝试对 C++ 库的所有调用进行异步调用,这就是我使用libuv. 我基本上遵循教程。

我希望能够从 libuv 调用类成员函数uv_queue_work。看看这段代码——

class test {
  private:
    int data;
    void Work(uv_work_t *req);
    void After(uv_work_t *req);
  public:
    Handle<Value> Async(const Arguments& args) {
      HandleScope scope;
      Local<Function> callback = Local<Function>::Cast(args[0]);
      int status = uv_queue_work(uv_default_loop(), **something**, Work, After);
      assert(status == 0);
      return Undefined();
    }
};

基本上我希望WorkandAfter函数data在类的元素上起作用。然而,这似乎不起作用。我尝试将指针从 type转换Work为. 但这似乎也不起作用。Aftervoid test::(*)(uv_work_t*)void (*)(uv_work_t*)

你们能给我一些关于如何解决这个问题的建议吗?

4

1 回答 1

7

所以你已经意识到,你不能直接调用成员函数。

第二个参数“ something ”是 uv_work_t 类型,它有一个成员“void* data”。

您需要做的是在您的类中为“Work”和“After”创建静态方法,创建一个 uv_work_t 结构,并将数据分配给“this”。

一旦在你的静态“Work”和“After”方法中完成,你就对“req->data”(到你的类类型)进行静态转换,然后调用你的成员函数。

例如:

uv_work_t* baton = new uv_work_t();
baton->data = this;
int status = uv_queue_work(uv_default_loop(), baton, StaticWork, StaticAfter);

然后在静态方法中

test* myobj = static_cast<test>(req->data);
myobj->Work();

以及 StaticAfter 函数的类似代码

于 2012-08-21T12:33:22.993 回答