emscripten webworker的最小工作示例

Minimal working example for emscripten webworker

本文关键字:工作 webworker emscripten      更新时间:2023-10-16

我试图用emscripten在c++中构建一个基本的网络工作者示例。这个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

和一个简单的js加载通过<script>标签在html端。

Main加载启动,输出Main func.,然后下载worker js。但是WorkerCallback都没有输出。

使用BUILD_AS_WORKER标志编译

emcc -std=c++11 worker.cpp -s EXPORTED_FUNCTIONS="['_one']" -s BUILD_AS_WORKER=1 -o worker.js