在类中使用libuv

ssb*_*ssb 4 c++ asynchronous casting node.js libuv

我正在尝试为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();
    }
};
Run Code Online (Sandbox Code Playgroud)

基本上我希望WorkAfter函数能够处理data类的元素.然而,这似乎不起作用.我曾尝试类型转换的指针WorkAfter之后,从类型void test::(*)(uv_work_t*)void (*)(uv_work_t*).但这似乎也没有用.

你能给我一些关于如何解决这个问题的技巧吗?

maj*_*ann 6

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

第二个参数" something "的类型为uv_work_t,其成员为"void*data".

您需要做的是在类中为"工作"和"之后"创建静态方法,创建一个uv_work_t结构,并将数据分配给"this".

一旦在静态"工作"和"后"方法中完成,你就可以对"req-> data"(对你的类类型)进行静态转换,然后调用你的成员函数.

例如:

uv_work_t* baton = new uv_work_t();
baton->data = this;
int status = uv_queue_work(uv_default_loop(), baton, StaticWork, StaticAfter);
Run Code Online (Sandbox Code Playgroud)

然后在静态方法中

test* myobj = static_cast<test>(req->data);
myobj->Work();
Run Code Online (Sandbox Code Playgroud)

和StaticAfter函数类似的代码

  • 是的....我正在尝试某种类似的东西......但这不会导致大量额外的代码被写入?我的意思是你将有一个用于javascript调用的函数,两个用于uv_queue_work处理程序,然后还有一个用于实际执行该工作的函数?所以,如果我已经有一个大型代码库来完成这项工作(但没有异步调用)....它将类似于重写整个事情! (2认同)