javascript - 使用 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 消息输出到控制台时会触发中断。
解决方案
推荐阅读
- visual-studio - 无法在现代 Windows 上启动 Visual Studio 2008 dll
- css - 使用 Grid 和 Flexbox 的响应式页面问题
- java - 在 Python 中使用 X509 证书签署信封,结果与 Java 相同
- download - 如何优化从 Google Colab 下载数据集的时间?
- csv - 使用 Tensorflow 和 Keras 训练高光谱数据
- python - Google Ads API ConversionTrackerService - 仅返回单次转化
- mysql - Multiple insert from hbs to MySQL express js
- sql - 显示最近的笔记
- mysql - 比较嵌套关系belongToMany Laravel中的withCount
- linux - Linux 上的 Cucumber 与 Windows 上的 Cucumber - 需要了解优缺点