在类内部使用libuv

Using libuv inside classes

本文关键字:libuv 内部      更新时间:2023-10-16

我正试图为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();
    }
};

基本上,我希望WorkAfter函数处理类的data元素。然而,这似乎并不奏效。我已经尝试过在从类型void test::(*)(uv_work_t*)到类型void (*)(uv_work_t*)之后对指向WorkAfter的指针进行类型转换。但这似乎也不起作用。

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

因此,正如您所意识到的,您不能直接调用成员函数。

第二个参数"something"的类型为uv_work_t,它有一个成员"void*data"。

您需要做的是在类中为"Work"answers"After"创建静态方法,创建uv_Work_t结构,并将数据分配给"this"。

在静态"Work"answers"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函数的类似代码