Я пишу дополнение для node.js, используя c ++.
вот некоторые фрагменты:
class Client : public node::ObjectWrap, public someObjectObserver {
public:
void onAsyncMethodEnds() {
Local<Value> argv[] = { Local<Value>::New(String::New("TheString")) };
this->callback->Call(Context::GetCurrent()->Global(), 1, argv);
}
....
private:
static v8::Handle<v8::Value> BeInitiator(const v8::Arguments& args) {
HandleScope scope;
Client* client = ObjectWrap::Unwrap<Client>(args.This());
client->someObject->asyncMethod(client, NULL);
return scope.Close(Boolean::New(true));
}
static v8::Handle<v8::Value> SetCallback(const v8::Arguments& args) {
HandleScope scope;
Client* client = ObjectWrap::Unwrap<Client>(args.This());
client->callback = Persistent<Function>::New(Handle<Function>::Cast(args[0]));
return scope.Close(Boolean::New(true));
}
Мне нужно сохранить функцию JavaScript как обратный вызов, чтобы вызвать его позже.
Класс Client является наблюдателем для другого объекта, и обратный вызов javascript должен вызываться из onAsyncMethodEnds.
К сожалению, когда я вызываю функцию «BeInitiator», я получаю сообщение об ошибке «Bus error: 10» непосредственно перед обратным вызовом Call ()
спасибо в совете
Ты не можешь ->Call
из другого потока. JavaScript и Node являются однопоточными, и попытка вызвать функцию из другого потока равносильна попытке запустить два потока JS одновременно.
Вы должны либо переработать код, чтобы не делать этого, либо читать libuv
Threading библиотека. Это обеспечивает uv_async_send
который может использоваться для запуска обратного вызова в главном цикле JS из отдельного потока.
Здесь есть документы: http://nikhilm.github.io/uvbook/threads.html
Других решений пока нет …