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();
    }
};

Work基本的に、関数と関数がクラスの要素でAfter機能することを期待しています。dataただし、これは機能しないようです。typeからへのポインタWorkAfterその後のポインタを型キャストしてみました。しかし、それもうまくいかないようです。void test::(*)(uv_work_t*)void (*)(uv_work_t*)

これを回避する方法についてのヒントを教えていただけますか??

4

1 に答える 1

7

お気づきのとおり、メンバー関数を直接呼び出すことはできません。

2番目の引数「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 に答える