【发布时间】:2023-12-24 22:34:01
【问题描述】:
我正在尝试使用 emscripten 在 C++ 中构建一个基本的 webworker 示例。 API 看起来很简单,但我无法让它工作。我实际上想在我的项目中实现这个功能,但是在失败后尝试做一个最小的例子,它也不起作用。
我有 main.cpp:
#include <emscripten/emscripten.h>
#include <emscripten/bind.h>
#include <iostream>
namespace e = emscripten;
int counter = 0;
void cback(char* data, int size, void* arg) {
std::cout << "Callback" << std::endl;
counter++;
}
void loop() {
std::cout << "Counter: " << counter << std::endl;
}
int main() {
std::cout << "Main func." << std::endl;
worker_handle worker = emscripten_create_worker("worker.js");
emscripten_call_worker(worker, "one", 0, 0, cback, (void*)42);
emscripten_set_main_loop(loop, 2, true);
return 0;
}
和worker.cpp:
#include <iostream>
#include <emscripten/emscripten.h>
extern "C" {
void one(char* data, int size) {
for(int i=0; i<10; i++) {
std::cout << "Worker" << std::endl;
emscripten_worker_respond_provisionally(0, 0);
}
emscripten_worker_respond(0, 0);
}
}
编译通过
emcc -std=c++11 main.cpp -o main.js
emcc -std=c++11 worker.cpp -s EXPORTED_FUNCTIONS="['_one']" -o worker.js
并通过 html 端的 <script> 标签加载一个简单的 js。
Main 加载并启动,输出Main func. 然后下载worker js。但是Worker 和Callback 都没有输出。未报告任何错误。
【问题讨论】:
-
运行 em++ 代替 emcc 有什么不同吗?
-
为什么要导入
emscripten/bind.h?
标签: javascript c++ web-worker emscripten