jos*_*736 9 c++ winapi v8 node.js libuv
在Windows nodejs插件中,我创建了一个用于接收消息的窗口.
Handle<Value> MakeMessageWindow(const Arguments &args) { // exposed to JS
...
CreateWindow(L"ClassName", NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, 0, 0);
...
}
Run Code Online (Sandbox Code Playgroud)
我有一个wndproc函数.
Local<Function> wndProc;
LRESULT APIENTRY WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
// pack up the arguments into Local<Value> argv
wndProc->Call(Context::GetCurrent()->Global(), 3, argv);
}
Run Code Online (Sandbox Code Playgroud)
现在我需要抽取消息.通常,你会做类似的事情
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Run Code Online (Sandbox Code Playgroud)
...但这不起作用,因为它只会阻止v8事件循环.
如何以不阻止v8的方式提取Windows消息,并允许我在窗口收到消息时调用JS函数?
我假设libuv将扮演一个角色,但我不确定如何安全地从C运行在一个单独的线程上调用JS函数,特别是因为uv_async_send不保证每次调用它时都会调用一个回调,我需要确保每次收到窗口消息时都会调用我的JS回调.
jos*_*736 11
我的错误是试图在V8线程上创建窗口.相反,uv_thread_create应该用于调用在新线程上创建窗口的函数,然后继续执行自己的消息泵循环.
然后,wndproc函数需要以线程安全的方式将收到的消息保存到队列中,然后用于uv_async_send通知V8线程消息已到达.
uv_async_init然后在消息入队后调用V8线程上的函数(传递给它).该函数(线程安全地)将每个待处理消息从队列中弹出并调用JS回调.
| 归档时间: |
|
| 查看次数: |
1514 次 |
| 最近记录: |