6

我是 nodeJS 和节点扩展的新手。我正在为节点 js 编写本机扩展,它将接收虚拟函数 OnEvent(param1,param2,param3)的回调。代码如下:

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。
  • 不要忘记 uv_close 回到 main 上。

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 回答