6

私はnodeJSとノード拡張の初心者です。仮想関数 OnEvent(param1, param2, param3) でコールバックを受け取るノード js のネイティブ拡張を作成しています。コードは次のとおりです。

bool MyExt::OnEvent(int eventType, string param1, string param2)
{
    printf("MyExt:: onevent___ \n");
    {
        //// Crashes here, but if I use Locker, it get stuck!!!!!!
        //Locker l;
        Local<Value> argv[3] = {
            Local<Value>::New(Integer::New(1)),
            Local<Value>::New(String::New("parameter 1")),
            Local<String>::New(String::New("parameter 2"))
        };

        TryCatch try_catch;
        //// I need to call this
        m_EventCallback->Call(Context::GetCurrent()->Global(), 3, argv);
        if (try_catch.HasCaught()){
                printf("Callback is Exception()  \n");
        }
        printf("Callback is IsCallable() \n");
    }
    return true;
}

m_EventCallback を使用して、このコールバック パラメータをサーバー スクリプトに転送する必要があります。関数 bool OnEvent は別のスレッドから呼び出されます。

uv_async_send を使用してみましたが、成功しませんでした。

ヘルプやガイダンスをいただければ幸いです。

4

2 に答える 2

6

uv_async_send を使用するのが正しい方法です。

  • 「メイン」スレッドで uv_async_init を呼び出します。
  • 次に、ワーカーから uv_async_send を呼び出します。
  • main に戻る uv_close を忘れないでください。

http://nikhilm.github.com/uvbook/threads.html

于 2013-03-29T10:07:38.870 に答える
1

たぶんuv_callbackがオプションになるでしょう。

これにより、他のスレッドで関数を呼び出すことができます。

非合体呼び出しを処理できます。

別の関数の呼び出し元スレッドで非同期的に結果を取得することもできます。例えば:

呼び出されたスレッドで:

uv_callback_t send_data;

void * on_data(uv_callback_t *handle, void *data) {
  int result = do_something(data);
  free(data);
  return (void*)result;
}

uv_callback_init(loop, &send_data, on_data, UV_DEFAULT);

呼び出しスレッドで:

uv_callback_t result_cb;

void * on_result(uv_callback_t *handle, void *result) {
  printf("The result is %d\n", (int)result);
}

uv_callback_init(loop, &result_cb, on_result, UV_DEFAULT);

uv_callback_fire(&send_data, data, &result_cb);
于 2017-05-05T00:23:11.650 に答える