使用std :: thread时无法在'WorkerGlobalScope'上执行'importScripts'

问题描述 投票:-2回答:1

我正在尝试使用std :: thread。

main.cpp

int main()
{
    std::cout << "Welcome WASM!" << std::endl;
    std::cout << "Main thread=" << std::this_thread::get_id() << std::endl;

    auto a2 = std::thread([](){
        std::cout << "Worker thread=" << std::this_thread::get_id() << std::endl;
        unsigned int i = 0; 
        while (i < 100) {
            std::cout << i++ << '\n';
            std::this_thread::sleep_for(std::chrono::milliseconds(200));
        }
    });

    a2.detach();
}

编译:

emcc -O2 -std=c++17 -s USE_PTHREADS=1 -o build\main.js main.cpp

此命令生成main.js,main.worker.js和main.wasm。我的HTML使用main.js

<script src="main.js"></script>

但是我在main.worker.js中遇到错误:

chrome dev tool screenshot

web-worker emscripten webassembly
1个回答
0
投票

解决方案参考:https://emscripten.org/docs/compiling/WebAssembly.html#web-server-setup

找到了解决方案,问题出在我用来提供文件(HTML / js / wasm)的Web服务器上。之前我通过命令python -m SimpleHTTPServer 8000运行这是通过MIME类型“ text / pain”提供所有文件(js / wasm)的功能,而chrome浏览器只是拒绝了它(我们可以在dev工具的屏幕截图中看到它)。 Chrome预期wasm和js文件的application / wasmapplication / javascript MIME类型。

由StackOverflow伙伴之一建议,现在,我正在运行Web服务器,该服务器使用MIME类型的application / wasm和WAS文件提供WASM文件。现在所有错误都消失了,我可以同时使用std :: thread和std :: async了。

server.py

import SimpleHTTPServer import SocketServer PORT = 8000 class Handler(SimpleHTTPServer.SimpleHTTPRequestHandler): pass Handler.extensions_map['.wasm'] = 'application/wasm' Handler.extensions_map['.js'] = 'application/javascript' httpd = SocketServer.TCPServer(("", PORT), Handler) print "serving at port", PORT httpd.serve_forever()

main.cpp

int main() { std::cout << "Welcome WASM!" << std::endl; std::cout << "Main thread=" << std::this_thread::get_id() << std::endl; auto f = std::thread([](){ std::cout << "Worker thread=" << std::this_thread::get_id() << std::endl; unsigned int i = 0; while (i < 100) { std::cout << i++ << '\n'; std::this_thread::sleep_for(std::chrono::milliseconds(200)); } }); f.detach(); }

编译命令

emcc -std=c++17 --bind -s USE_PTHREADS=1 -s PTHREAD_POOL_SIZE=2 -s PROXY_TO_PTHREAD=1 -s TOTAL_MEMORY=1073741824 -o build\main.js main.cpp -s ASSERTIONS=1
© www.soinside.com 2019 - 2024. All rights reserved.