2013-07-19 2 views
9

В аддон Windows nodejs я создал окно с целью получения сообщений.Как перекачать сообщения окна в аддон nodejs?

Handle<Value> MakeMessageWindow(const Arguments &args) { // exposed to JS 
    ... 
    CreateWindow(L"ClassName", NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, 0, 0); 
    ... 
} 

У меня есть функция 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); 
} 

Теперь мне нужно перекачать сообщения. Как правило, вы могли бы сделать что-то вроде

MSG msg; 
while (GetMessage(&msg, NULL, 0, 0)) 
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 

... но это не будет работать, так как это было бы просто блокировать цикл v8 событий.

Как перекачать сообщения Windows способом, который не будет блокировать v8, и позволяет мне вызывать функцию JS, когда мое окно получает сообщения?

Я предполагаю, что libuv будет играть определенную роль, но я точно не знаю, как безопасно вызывать функцию JS из C, работающую на отдельном потоке, особенно с uv_async_send is not guaranteed to invoke a callback every time you call it, и мне нужно обеспечить, чтобы каждый раз вызывался JS-обратный вызов появляется оконное сообщение.

ответ

11

Моя ошибка пыталась создать окно в потоке V8. Вместо этого uv_thread_create следует использовать для вызова функции, которая создает окно по новому потоку, а затем переходит к своей собственной конвейерной системе сообщений.

Функция wndproc затем должна сохранять полученные сообщения в очередь в потокобезопасном режиме, а затем использовать uv_async_send, чтобы уведомить поток V8, который был получен.

После того, как сообщения находятся в очереди, активируется функция в потоке V8 (которая была передана uv_async_init). Функция (поточно-безопасно) выталкивает каждое ожидающее сообщение из очереди и вызывает обратный вызов JS.

+3

Отличная информация. У вас, случайно, есть модуль репо или узел, который это выполняет? Я хочу сделать то же самое. – Charlie

+0

Был ли ваш подход работать? У меня возникли проблемы с передачей функции обратного вызова в uv_async_send, после вызова функции uv_thread_create, я не могу получить функцию обратного вызова. Даже постоянные ручки не работают - я тоже разместил этот вопрос в SO.http: //stackoverflow.com/questions/31159029/how-to-use-persistent-handles-for-callback-functions-in-v8 – opensourcegeek

+0

Есть ли у вас или знаете код репо, использующий этот метод? Это именно тот подход, который я принимаю. – Niall

Смежные вопросы