2012-07-09 8 views
5

Ich erstelle ein Knoten C++ Addon, das eine js Funktion zurückrufen soll, da Ereignisse von einem anderen Thread ausgelöst werden, der nicht unter meiner Kontrolle ist (es ist tatsächlich ein .net-Thread von einer verwalteten DLL, die ich verwende). Da die JS-Welt single-threaded ist, kann ich nicht einfach die js-Funktionsreferenz beibehalten und sie von diesem Nicht-js-Thread aus aufrufen. Ich kann nicht einmal die Parameter erstellen, die ich an diese Callback-Funktion in diesem Thread weitergeben möchte.Node.js C++ - Addon: Mehrere Callbacks von verschiedenen Thread

Ich habe gesehen, uv_queue_work in Fällen, in denen Sie Arbeit aus dem js-Thread verschieben und einmal beendet und aus dem js-Thread aufgerufen werden, um alles, was Sie tun müssen, wie z. Zurückrufen einer js-Funktion.

Für den späteren Gebrauch auf, dann ist hier, dass die Unterzeichnung der Funktion:

int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb, 
uv_after_work_cb after_work_cb); 

uv_queue_work Aufruf für einmalige Aufträge in Ordnung ist, und ich konnte es mir wahrscheinlich durch beliebig oft bekommen anrufen Anrufe uv_queue_work von after_work_cb verketten, während work_cb synchronisiert mit diesem anderen Thread, aber ich frage mich, ob es keinen einfacheren Weg gibt, es zu tun.

Wie eine von node.js bereitgestellte fn, die direkt von einem anderen Thread mit einem fn-Zeiger aufgerufen werden könnte, der auf Code zeigt, der beim nächsten Mal auf dem js-Hauptthread ausgeführt wird. Irgendeine Idee?

Antwort

7

Anstatt uv_queue_work zu verwenden, sollten Sie sich die Funktionen uv_async_ * ansehen (Check out https://github.com/joyent/libuv/blob/master/include/uv.h).

Eine sehr nette Implementierung davon kann im Knoten sqllite Projekt https://github.com/developmentseed/node-sqlite3/blob/master/src/async.h gefunden werden.

Nur Beachten Sie jedoch, wenn Sie nicht EXTREM vorsichtig mit diesem Zeug, werden Sie mit einigen TERRIBLE Schleife Referenzzähler Fehler am Ende (Application beendet zu früh oder gar nicht)

+0

Spot- auf! Genau das, was ich brauche. –

Verwandte Themen