emscripten webworker 的最小工作示例

Posted

技术标签:

【中文标题】emscripten webworker 的最小工作示例【英文标题】:Minimal working example for emscripten webworker 【发布时间】:2015-08-29 22:02: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 端的 &lt;script&gt; 标签加载一个简单的 js。

Main 加载并启动,输出Main func. 然后下载worker js。但是WorkerCallback 都没有输出。未报告任何错误。

【问题讨论】:

运行 em++ 代替 emcc 有什么不同吗? 为什么要导入emscripten/bind.h 【参考方案1】:

使用BUILD_AS_WORKER 标志编译。

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

【讨论】:

以上是关于emscripten webworker 的最小工作示例的主要内容,如果未能解决你的问题,请参考以下文章

使用 Emscripten Worker API 传输数据而无需复制

Emscripten 中的“Module”变量机制,同时将 Pthread 编译为 worker

H5新特性-WebWorker

web worker 比原生线程更重还是更轻

Emscripten Clang 生成 ELF 64 位可执行文件和 wasm 二进制交叉编译器目标

Emscripten教程之Emscripten的运行时环境