2013-07-19 14 views
9

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); 
    ... 
} 

私は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イベントループをブロックするだけで動作しません。

にはどうすればV8をブロックしないようにし、Windowsのメッセージポンプと私の窓がメッセージを受信したとき、私はJS関数を呼び出すことができますか?

私はlibuvが役割を果たしていると推測しますが、別のスレッドで実行されているCのJS関数を安全に呼び出す方法がわからない、特にuv_async_send is not guaranteed to invoke a callback every time you call it以降です.JSコールバックが毎回呼び出されるようにする必要があります。ウィンドウメッセージが受信される。

答えて

11

私の間違いは、V8のスレッドでウィンドウを作成しようとしていました。その代わり、uv_thread_createは、新しいスレッド上のウィンドウを作成し、独自のメッセージポンプループを行うに移行する機能を呼び出すために使用されるべきです。

wndproc関数は、受信したメッセージをスレッドセーフな方法でキューに保存してから、メッセージが到着したことをV8スレッドに通知するためにuv_async_sendを使用する必要があります。メッセージがエンキューされた後

uv_async_initに渡された)V8スレッド上の機能は、その後に呼び出されます。関数は(スレッドを安全に)待ち行列から外す各ペンディングメッセージをポップし、JSコールバックを呼び出します。

+3

グレート情報。あなたは、これを実現するレポやノードモジュールを偶然に持っていますか?私は同じことをするために探しています。 – Charlie

+0

あなたのアプローチは機能しましたか?コールバック関数をuv_async_sendに渡すのに問題があります。関数uv_thread_createが呼び出されると、コールバック関数を保持できません。でも、永続的なハンドルが出て働いていない - 私はSO too.httpにその質問を掲載しました://stackoverflow.com/questions/31159029/how-to-use-persistent-handles-for-callback-functions-in-v8 – opensourcegeek

+0

このテクニックを使用するコードレポを持っているか知っていますか?これはまさに私が取っているアプローチです。 – Niall

関連する問題