2012-07-09 28 views
5

Tôi đang tạo một nút C++ addon được gọi là hàm js khi các sự kiện được kích hoạt bởi một số luồng khác không nằm trong tầm kiểm soát của tôi (nó thực sự là một .net chủ đề từ một dll quản lý tôi sử dụng). Vì thế giới JS là đơn luồng, tôi không thể chỉ giữ tham chiếu hàm js xung quanh và gọi nó từ luồng không phải js đó. Tôi thậm chí không thể tạo các tham số mà tôi muốn chuyển đến hàm gọi lại đó trên chuỗi đó.Node.js C++ addon: Nhiều callback từ thread khác nhau

Tôi đã xem uv_queue_work đang được sử dụng trong trường hợp bạn muốn di chuyển công việc ra khỏi chuỗi js và sau khi hoàn tất và được gọi lại từ chuỗi js để làm bất cứ điều gì bạn cần làm, chẳng hạn như gọi lại hàm js.

Để tham khảo sau, đây là chữ ký của chức năng đó:

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

Calling uv_queue_work là tốt cho một lần ăn việc làm, và tôi có thể có thể làm cho nó gọi tôi là tùy tiện thường bằng cách kết nối các cuộc gọi đến uv_queue_work từ after_work_cb, trong khi work_cb đồng bộ hóa với chủ đề khác, nhưng tôi tự hỏi nếu không có cách nào đơn giản hơn để làm điều đó.

Giống như một fn do node.js cung cấp có thể được gọi trực tiếp bởi bất kỳ chuỗi nào khác với con trỏ fn trỏ đến mã sẽ được thực thi trên chuỗi js chính vào dịp tiếp theo. Bất kỳ ý tưởng?

Trả lời

7

Thay vì sử dụng uv_queue_work, bạn nên xem các hàm uv_async_ * (Xem https://github.com/joyent/libuv/blob/master/include/uv.h).

Thực hiện rất tốt điều này có thể được tìm thấy trong dự án sqllite nút https://github.com/developmentseed/node-sqlite3/blob/master/src/async.h.

Chỉ cần một lưu ý tuy nhiên, nếu bạn không phải là HẾT MÌNH cẩn thận với công cụ này, bạn sẽ kết thúc với một số khủng khiếp loop lỗi đếm tham chiếu (Application thoát đến sớm, hoặc không gì cả)

+0

Spot- trên! Chính xác những gì tôi cần. –

Các vấn đề liên quan