首页 > 解决方案 > 使用 v8 在 c++ 中设置一个已经创建的全局 js 变量?

问题描述

我的 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.ctrC 的值永远不会改变。global 是全局变量的列表。setTimeout 是来自https://www.w3schools.com/jsref/met_win_settimeout.asp的函数。函数 signal.startSignalWatching 从 C++ 代码 JsSetUpSignals() 调用函数,这是定义隔离和上下文的地方。

我知道在 printf 消息输出到控制台时会触发中断。

标签: javascriptc++v8embedded-v8

解决方案


推荐阅读