【问题标题】:Using libuv inside classes在类中使用 libuv
【发布时间】:2012-08-15 15:18:48
【问题描述】:

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

我正在努力尝试使对 C++ 库的所有调用都异步,这就是我使用 libuv 的原因。我基本上是在关注this 教程。

我希望能够从 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。但这似乎也不起作用。

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

【问题讨论】:

    标签: c++ node.js asynchronous casting libuv


    【解决方案1】:

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

    第二个参数“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 函数的类似代码

    【讨论】:

    • 嗯,是的……我正在尝试类似的东西……但这不会导致编写大量额外的代码吗?我的意思是你将有一个用于 javascript 调用的函数,两个用于 uv_queue_work 处理程序,然后还有一个用于实际工作的函数?所以如果我已经有一个可以完成这项工作的大型代码库(但没有异步调用)......这将类似于重写整个事情!!!
    • 我不记得确切的实现细节,但我设法使用模板和模板化函数指针来实现一个基类,以提取很多通用代码......但是你仍然结束加上很多“额外”代码:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    相关资源
    最近更新 更多