Установить уже созданную глобальную переменную js в c ++ с v8? - PullRequest
0 голосов
/ 04 февраля 2020

В моем коде js есть глобальная переменная, и я пытаюсь установить для нее значение, отличное от c ++. Я пробовал:

    v8::Isolate* isolate = v8::Isolate::GetCurrent();
    v8::Local<v8::Context> ctx = isolate->GetCurrentContext();

    v8::Local<v8::Value> value= WrapV8::NewString(isolate, "true");
    ctx->Global()->Set(ctx, v8::String::NewFromUtf8(isolate, "globalVariable",
      v8::NewStringType::kNormal).ToLocalChecked(), value);

Однако это не меняет глобальную переменную.

Большинство других примеров этого устарели и иногда устарели.

Мой c код:

 void SignalHandler::intrpt(int signum) {
    printf("callign intrpt");
    v8::Isolate* isolate = v8::Isolate::GetCurrent();
    v8::Local<v8::Context> context = isolate->GetCurrentContext();
    v8::Local<v8::Value> boolC = WrapV8::NewString(isolate, "true");
    context->Global()->Set(context, v8::String::NewFromUtf8(isolate, "ctrC", v8::NewStringType::kNormal).ToLocalChecked(),
      boolC);
  }

void SignalHandler::JsSetUpSignals(const v8::FunctionCallbackInfo<v8::Value>& args) {
    v8::Isolate* isolate = args.GetIsolate();
    v8::HandleScope handleScope(isolate);
    v8::Local<v8::Context> context = isolate->GetCurrentContext();
    v8::Local<v8::Value> val = v8::Number::New(isolate, 1);
    (void)signal(SIGINT, intrpt);
    printf("got here\n");

  }

void SignalHandler::JsConstructor(const v8::FunctionCallbackInfo<v8::Value>& args) {
    if (WrappedObject::CallConstructor(args)) return;
    v8::Isolate* isolate = args.GetIsolate();
    SignalHandler* signalHandler = new SignalHandler();
    signalHandler->wrap(isolate, args);
  }

Мой JS код:

signal.startSignalWatching = () => {
  var thread1 = new Thread(
    () => {
      SignalHandler = new internals.SignalHandler()
      global.ctrC = false;
      SignalHandler.setUpSignals()
      waitTimer();
    }
  );


 function waitTimer() {
    if (global.ctrC != false) {
      console.log("found it")
      return;
    } else {
      console.log("waiting it", global.ctrC, Object.keys(global).length)
      setTimeout(waitTimer, 800); // try again in 300 milliseconds
      return;
    }
  }

Значение global.ctr C никогда не изменяется. global это список глобальных переменных. setTimeout является функцией от https://www.w3schools.com/jsref/met_win_settimeout.asp. Функция signal.startSignalWatching вызывает функцию из кода C ++ JsSetUpSignals (), в котором определены изолят и контекст.

В какой-то момент я знаю, что прерывание срабатывает, когда сообщение printf выводится на консоль.

...