1

C++ を使用して node.js のアドオンを作成しています。

ここにいくつかのスニペットがあります:

class Client : public node::ObjectWrap, public someObjectObserver {
public:
  void onAsyncMethodEnds() {
    Local<Value> argv[] = { Local<Value>::New(String::New("TheString")) };
    this->callback->Call(Context::GetCurrent()->Global(), 1, argv);
  }
....
private:
  static v8::Handle<v8::Value> BeInitiator(const v8::Arguments& args) {
    HandleScope scope;
    Client* client = ObjectWrap::Unwrap<Client>(args.This());

    client->someObject->asyncMethod(client, NULL);

    return scope.Close(Boolean::New(true));        
  }      

  static v8::Handle<v8::Value> SetCallback(const v8::Arguments& args) {
    HandleScope scope;
    Client* client = ObjectWrap::Unwrap<Client>(args.This());
    client->callback = Persistent<Function>::New(Handle<Function>::Cast(args[0]));

    return scope.Close(Boolean::New(true));
  }

後で呼び出すには、javascript 関数をコールバックとして保存する必要があります。Client クラスは別のオブジェクトのオブザーバーであり、javascript コールバックは onAsyncMethodEnds から呼び出す必要があります。残念ながら、関数「BeInitiator」を呼び出すと、コールバック Call() の直前に「Bus error: 10」エラーが発生します。

アドバイスありがとう

4

1 に答える 1

3

->Call別のスレッドからはできません。JavaScript と Node はシングル スレッドであり、別のスレッドから関数を呼び出そうとすると、JS の 2 つのスレッドを同時に実行しようとすることになります。

そうならないようにコードを作り直すか、libuvのスレッド化ライブラリを読む必要があります。uv_async_send別のスレッドからメインの JS ループでコールバックをトリガーするために使用できるものを提供します。

ここにドキュメントがあります: http://nikhilm.github.io/uvbook/threads.html

于 2013-06-13T15:40:47.657 に答える